PHP Script per Cronjob aufrufen

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • PHP Script per Cronjob aufrufen

    Hi,

    es gibt ein PHP-Script, was sich immer wieder selbst aufruft, da die Einträge in die Datenbank paketweise erledigt werden. Das Skript kann ich ja nicht per HTTP aufrufen. Wie kann ich per Cronjob trotzdem erreichen das sich das Skript erneut aufruft? Es gibt doch bestimmt auch bei einem Cronjob eine zeitliche Bschränkung wie lang ein Script läuft.

  • #2
    Du kannst das Script per Cron entweder über einen Browser (lynx, wget, w3m, whatever) oder auf der Kommandozeile aufrufen. Crontab sähe dann so aus - Ausführung jede Minute
    Code:
    * * * * * /usr/bin/lynx -source http://example.com/script.php 2>&1 # Browser lynx
    * * * * * /usr/bin/wget -q http://example.com/script.php 2>&1 # Downloader wget
    * * * * * /usr/bin/php /path/to/docroot/script.php 2>&1 # PHP CLI
    Beachte, dass bei der CLI-Variante im Script natürlich nicht die Webserver-Umgebung ($_SERVER) vorhanden ist.

    Die max_execution_time kannst du im Script mit set_time_limit(0); auf unendlich setzen. Sollte dein Provider das mit SafeMode verhindern, versuch die CLI-Variante. Denn dabei ist max_execution_time standardmäßig unendlich. Sollte auch hier dein Provider ein Limit gesetzt haben und du es nicht ändern können, musst du mit ihm sprechen. Wenn er dir nicht entgegen kommt, bleibt dir nichts anderes übrig, als im Script die Arbeit in Häppchen zu unterteilen, die im Zeitlimit machbar sind.

    Comment


    • #3
      Hi,

      danke, das werd ich mir mal so einrichten.
      Das ursprüngliche Skript hat sich ja mittels GET-Parameter aufgerufen. Nun läuft der Cron jede Minute. Woher weiß dann das Skript an welcher Stelle es weitermachen muss?

      Comment


      • #4
        das wirst du dir selbst irgendwie "merken" müssen -

        vielleicht über eine kleine ini-datei, die dein script beim start liest - startwert herausholt , n schritte macht , ini-datei wieder schreibt mit dem erreichten End-wert .. usw
        [font=Verdana]
        Wer LESEN kann, ist klar im Vorteil!
        [/font]

        Comment


        • #5
          Wenn das Script seine Arbeit nicht in einem Rutsch erledigen kann, muss man nach den Gründen dafür unterscheiden:
          a) Das Script wird wegen Zeitlimit beendet, bevor die Arbeit komplett erledigt ist.
          b) Das Script braucht für die Arbeit (möglicherweise) länger als ein Cron-Intervall, wird also erneut aufgerufen bevor es fertig ist.
          Theoretisch können auch beide Gründe auftreten, aber dann solltest du einfach das Cron-Intervall so hoch setzen, dass es größer als das Zeitlimit ist.

          Gegen a hilft der Ansatz von eagle275. Dabei musst du aber aufpassen, dass die n Schritte wirklich noch vor Ablauf des Zeitlimits erledigt werden. Wird das Script nach n-x Schritten abgebrochen, steht in der ini-Datei noch n-n und beim nächsten Run werden die n-x Schritte erneut ausgeführt.
          Da wir nicht wissen, was dein Script genau macht, kann man dazu nichts genaueres sagen. Im Prinzip könnte man sich die ini-Datei sparen, wenn das Script den letzten Stand anhand der Daten in der DB ermitteln kann. Man kann auch mit register_shutdown_function() arbeiten.

          Gegen b hilft das Setzen eines Locks, z.B. auf eine Datei. Beim Start sperrt das Script die Datei und am Ende gibt es sie wieder frei. Ist die Datei bereits gesperrt, ist klar, dass gerade eine andere Instanz des Scripts läuft. In diesem Fall sollte sich das Script einfach beenden.

          Comment


          • #6
            Ich lese aus einer Tabelle Daten aus und aktualisiere anhand dessen eine andere Tabelle. Da diese Aktualisierung ohne Aufteilung zu lang dauert hab ich es in Pakete zu je 100 Datensätzen aufgeteilt.
            Den Stand in der DB kann ich ja eritteln indem ich mit noch ein Kennzeichen setze. Aber entweder so oder über eine Datei werd ich das machen.

            Comment

            Working...
            X