Mario: Cronjob PHP Script ruft sich selbst mit neuen Variablen auf.

Guten Tag,

ich habe ein PHP-Script geschrieben, das mehrere Schritte abarbeitet.
Jeder Schritt wird mittels GET-Variable gestartet.
Bsp:
script.php?step=1
script.php?step=2
script.php?step=3

Jeder Schritt dauert in der Verarbeitung ca. 10 Minuten.

Ich habe das Script so angepasst, das wenn ich das Script im Browser anstoße
zu Kontrollzwecken u.a. eine Fortschrittsanzeige gezeigt wird.
Zum Schluss eines jeden Schrittes, startet das Script mit dem neuen Schritt als Variable via Javascript -> location.replace()

Soweit die manuelle Version des Scriptes.

Damit ich das ganze auch aus Cronjob laufen lassen kann, gibt es eine weitere Getvariable:
Bsp:
script.php?cron=true&step=1
script.php?cron=true&step=2
script.php?cron=true&step=3

Mit dieser zusätzlichen Variable gibt es keine Ausgaben und am Ende wird mittels header("Location: ...") der neue Script-Schritt aufgerufen.

Meine Frage ist nun. Kann ein PHP-Script das mittels Cronjob gestartet wurde sich überhaupt nach Verarbeitung selbst aufrufen.

Ein ähnliches Problem mit hintereinander aufgerufenen Schritten hatte auch ...
http://forum.de.selfhtml.org/archiv/2008/1/t165687/#m1080291
http://forum.de.selfhtml.org/archiv/2008/1/t165687/#m1080526
... leider wurde es nicht abschließend geklärt.

Kann mir jemand helfen?

Vielen Dank.

  1. Meine Frage ist nun. Kann ein PHP-Script das mittels Cronjob gestartet wurde sich überhaupt nach Verarbeitung selbst aufrufen.

    Kann es... aber nicht so wie du es dir vorstellst.

    Wenn du das Skript als Cronjob startest, machst du das entweder direkt über den PHP Interpreter und umgehst den Webserver ("php cronjob.php > debug.log"), dann gibt es sowas wie GET Variablen gar nicht, oder du startest dein Skript mittels Aufruf wie du es kennst über den Webserver ("wget http://domain/cronjob.php > debug.log"). Hier ist eine Weiterleitung am Ende nicht möglich, wget kann kein JavaScript und den Header "Location" kannst sowieso abhaken, da er zu Beginn eines Dokuments gesendet wird, nicht am Ende.

    Jetzt hast mehrere Möglichkeiten...

    • Fasse dein Skript zu einem zusammen
    • Führe die nächste Instanz am ende deines Skripts mit dem PHP Interpreter oder wget aus ( Befehle wie exec/system könnten da hilfreich sein)
    • include dein eigenes Skript an dessen Ende erneut
    • gibt noch hunderte weitere Ansätze, denk dir einen aus :)

    Die geringste Anpassung erfordert die Variante mit wget, sie ist aber auch die schlechteste ;)

    1. Hi,

      Hier ist eine Weiterleitung am Ende nicht möglich, wget kann kein JavaScript und den Header "Location" kannst sowieso abhaken, da er zu Beginn eines Dokuments gesendet wird, nicht am Ende.

      Du kannst HTTP-Header beliebig lange nach dem Start der Scriptinstanz ausloesen - so lange du nur vorher keine Ausgabe an den Client gesendet hast.

      MfG ChrisB

      1. Hallo RFZ, hallo ChrisB,

        vielen Dank für die Infos.

        Das mit dem HTTP-Header wußte ich. Das Script spuckt im Cronjob-Lauf auch nur den Header "Location" aus, so daß eine Weiterleitung ohne Probleme möglich wäre.

        Jedoch war mein Ansatz ja die Weitergabe der Schrittinstanz via Get-Variable, was ja anscheinend nicht geht.

        Ich entnehme aber den Vorschlägen von RFZ, das es anscheinend keine TimeOut-Problematik bei Cronjobs zu geben scheint. D.h. das das Script ruhig die halbe Stunde gesamtlaufzeit durchlaufen könnte. Richtig?

        Vielen Dank für Eure Hilfe,

        Mario

        1. Ich entnehme aber den Vorschlägen von RFZ, das es anscheinend keine TimeOut-Problematik bei Cronjobs zu geben scheint. D.h. das das Script ruhig die halbe Stunde gesamtlaufzeit durchlaufen könnte. Richtig?

          Richtig, du kannst das Zeitlimit z.B. mit set_time_limit() einfach abschalten - sofern dein PHP Skript gut programmiert ist, spricht nichts dagegen dass es Tage oder auch Monate lang läuft. In diesem Fall solltest aber wirklich auf den PHP Interpreter zugreifen (also mit "php cronjob.php" das Skript direkt starten) und nicht über den Webserver gehn.

          1. Richtig, du kannst das Zeitlimit z.B. mit set_time_limit() einfach abschalten - sofern dein PHP Skript gut programmiert ist, spricht nichts dagegen dass es Tage oder auch Monate lang läuft. In diesem Fall solltest aber wirklich auf den PHP Interpreter zugreifen (also mit "php cronjob.php" das Skript direkt starten) und nicht über den Webserver gehn.

            heißt der Befehl nicht

            php -f file.php

            ?

            Also ich rufe den Interpreter bislang mit dem Parameter auf, möglicherweise unnötig?

            Gruß, Samoht

            --
            fl:| br:> va:) ls:< n4:( ss:) de:] js:| mo:}
            "Computer games don't affect kids; I mean if Pac-Man affected us as kids, we'd all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music."
            (Kristian Wilson, Nintendo, 1989)
            1. Also ich rufe den Interpreter bislang mit dem Parameter auf, möglicherweise unnötig?

              An meinem Windows Server hab ich erst heute "php script.php" ausgeführt und afaik geht das auf meinem Linux Server auch.
              Funktionieren tut es auf jeden Fall, mag sein dass es den Parameter -f extra dafür gibt, aber da bin ich jetzt (wie du offensichtlich auch ^^) zu faul zum nachschauen :)

              Gruß,
              Andreas

          2. echo $begrüßung;

            Richtig, du kannst das Zeitlimit z.B. mit set_time_limit() einfach abschalten - sofern dein PHP Skript gut programmiert ist, spricht nichts dagegen dass es Tage oder auch Monate lang läuft. In diesem Fall solltest aber wirklich auf den PHP Interpreter zugreifen (also mit "php cronjob.php" das Skript direkt starten) und nicht über den Webserver gehn.

            Wenn PHP an der Kommandozeile, und auch so im Cronjob aufgerufen wird, ist die Defaulteinstellung für das Zeitlimit bereits 0, also unendlich. Anderslautende Einstellungen in der php.ini werden ignoriert. Man kann den Wert aber im Script einstellen, wenn man das wirklich wollte.

            echo "$verabschiedung $name";

      2. Du kannst HTTP-Header beliebig lange nach dem Start der Scriptinstanz ausloesen - so lange du nur vorher keine Ausgabe an den Client gesendet hast.

        Prinzipiell richtig, aber eine HTTP Verbindung die 10 Minuten ohne jeden Datentransfer vor sich hin dümpelt dürfte jeder HTTP Client ohne besondere Vorkehrungen trennen. Daher bin ich davon ausgegangen dass er während des Abarbeitens auch irgendwelche Statusinformationen ausgibt - oder hald mindestens irgendwas was die Verbindung am Leben hält.

        Gruß,
        Andreas