it-swarm.com.de

PHP: Ausführen von geplanten Jobs (Cron-Jobs)

Ich habe eine Website in meinem Webhotel, auf der ich einige geplante Aufgaben ausführen möchte. Welche Methoden würden Sie empfehlen, um dies zu erreichen?

Was ich bisher durchdacht habe, ist, dass auf jeder Seite ein Skript enthalten ist, das dann überprüft werden kann, ob es Zeit ist, diesen Job auszuführen.

Dies ist nur ein kurzes Beispiel für das, worüber ich nachgedacht habe:

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
   runTask();
   $timeToRunMaintainance = time() + $interval;
} 

Gibt es noch etwas, was ich berücksichtigen sollte, oder gibt es eine bessere Methode als diese?

38
Eikern

Dafür sind Cronjobs gemacht. man crontab vorausgesetzt, Sie betreiben einen Linux-Server. Wenn Sie keinen Shell-Zugriff haben oder keine Möglichkeit haben, Cronjobs einzurichten, gibt es kostenlose Dienste, die Cronjobs auf externen Servern einrichten und eine Ihrer URLs anpingen.

33
Armin Ronacher

Ich beantworte das jetzt, weil diese Lösung scheinbar niemand erwähnt zu haben scheint.

Auf einer Site, an der ich gerade arbeite, haben wir einen Cron-Job mit cPanel eingerichtet, aber anstatt den Interpreter PHP direkt auszuführen (da wir CodeIgniter verwenden und unser Code einer Controller-Funktion zugeordnet ist, Dies ist wahrscheinlich keine gute Idee. Wir verwenden wget.

wget -q -O cron_job.log http://somehost/controller/method

-q ist so, dass wget keine Ausgabe generiert (Sie erhalten also keine E-Mails mehr). -O cron_job.log speichert den Inhalt dessen, was Ihr Controller generiert, in einer Protokolldatei (die jedes Mal überschrieben wird, damit sie nicht weiter wächst).

Ich habe festgestellt, dass dies der einfachste Weg ist, um 'richtige' Cron-Funktion zu erreichen.

16
user7094

Wenn Sie über einen cPanel-Host verfügen, können Sie über die Weboberfläche Cron-Jobs hinzufügen. Gehen Sie zu Erweitert -> Cron-Jobs und verwenden Sie das nicht erweiterte Formular, um die Cron-Frequenz einzustellen. Sie möchten einen Befehl wie diesen:

/usr/bin/php /path/to/your/php/script.php
12

Hast du jemals nach ATrigger gesucht? Die Bibliothek PHP steht auch zum Erstellen geplanter Aufgaben ohne zusätzlichen Aufwand zur Verfügung.

Haftungsausschluss: Ich gehöre zu ihrem Team.

5
Kousha

wenn Sie sich fragen, wie Sie das Skript PHP tatsächlich von cron ausführen, gibt es zwei Möglichkeiten: Rufen Sie den Interpreter PHP direkt auf (z. B. "php /foo/myscript.php"), oder verwenden Sie lynx (lynx http://mywebsite.com/myscript.php ). Welche Sie auswählen, hängt hauptsächlich davon ab, wie Ihr Skript seine Umgebung konfiguriert. Die Pfade und Dateizugriffsberechtigungen hängen davon ab, ob Sie das Skript über die Shell oder den Webbrowser aufrufen. Ich würde empfehlen, Luchs zu verwenden.

Ein Nebeneffekt ist, dass Sie bei jeder Ausführung eine E-Mail erhalten. Um dies zu umgehen, mache ich meine cron PHP -Skripte, die nichts ausgeben (und es muss nichts sein, nicht einmal Leerzeichen), wenn sie erfolgreich abgeschlossen werden, und eine Fehlermeldung, wenn sie fehlschlagen. Ich rufe sie dann mit einem kleinen PHP Skript von cron auf. Auf diese Weise bekomme ich nur eine E-Mail, wenn diese fehlschlägt. Dies ist im Wesentlichen das gleiche wie bei der lynx-Methode, nur dass mein Shell-Skript die HTTP-Anforderung und nicht den lynx-Befehl ausführt.

Rufen Sie dieses Skript "docron" oder etwas (denken Sie an chmod + x) und verwenden Sie dann den Befehl in Ihrer crontab: "docron http://mydomain.com/myscript.php ". Sie erhalten eine E-Mail mit der Ausgabe der Seite als HTML-E-Mail, wenn die Seite etwas zurückgibt.

#!/usr/bin/php
<?php

$h = @file_get_contents($_SERVER['argv'][1]);

if ($h === false)
{
        $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1];
}

if ($h != '')
{
        @mail("[email protected]", $_SERVER['argv']['1'], $h, "From: [email protected]\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>
5
MrZebra

Wenn Sie vermeiden möchten, Cron-Jobs und so weiter einzurichten (obwohl ich vorschlagen würde, dass dies eine bessere Methode ist), ist die von Ihnen bereitgestellte Lösung ziemlich gut. Bei einer Reihe von Projekten habe ich das Skript PHP selbst überprüfen lassen, um zu sehen, ob es Zeit ist, das Update auszuführen.

Der Nachteil (okay, eins der Abwärtsseiten) ist, dass das Skript nicht ausgeführt wird, wenn niemand die App während eines bestimmten Zeitraums verwendet.

Der Vorteil ist, dass das Skript nicht ausgeführt wird, wenn niemand die App während eines bestimmten Zeitraums verwendet. Die Aufgaben, für die ich es eingerichtet habe, sind Dinge wie "Aktualisieren einer Cache-Datei", "Führen Sie eine tägliche Sicherung aus" und so weiter. Wenn jemand die App nicht verwendet, benötigen Sie keine aktualisierten Cache-Dateien und auch keine Datenbankänderungen für die Sicherung.

Die einzige Änderung an Ihrer Methode, die ich vorschlagen würde, besteht darin, dass Sie diese Prüfungen nur dann durchführen, wenn sich jemand erfolgreich anmeldet.

4
nickf

Cron ist eine Allzwecklösung für das Planen von Problemen. Aber wenn Sie groß werden und die Zeitpläne hoch sind, kann es zu Problemen mit der Zuverlässigkeit/Überschneidung kommen. Wenn Sie solche Probleme sehen, denken Sie an etwas wie beaufsichtigen oder komplexere monit .

4
mixdev

Wenn Sie Cpanel verwenden, sollten Sie Folgendes hinzufügen: 

/usr/local/bin/php -q /home/yoursite/public_html/yourfile.php
3
mokiSRB

Die Methode, die Sie verwenden, ist in Ordnung, wenn Sie keine Cronjobs oder etwas Externes verwenden möchten. Diese können jedoch bei jedem Laden einer Seite schwer zu überprüfen sein.

Zunächst können einige Cronjobs wahrscheinlich ersetzt werden. Wenn Sie beispielsweise über einen Zähler für die Anzahl der auf Ihrer Website registrierten Benutzer verfügen, können Sie diese Nummer einfach aktualisieren, wenn sich ein Benutzer registriert. Sie müssen dafür keinen Cronjob oder eine geplante Aufgabe verwenden.

Wenn Sie geplante Aufgaben verwenden möchten, empfehle ich Ihnen, die Methode zu verwenden, die Sie jetzt verwenden, jedoch mit ein paar Änderungen. Wenn Ihre Site an einem Tag über genügend Treffer verfügt, können Sie die Aufgaben (oder die Funktion zum Prüfen der Aufgaben) nur für 1% oder 0,01% der Treffer ausführen lassen (und nicht für alle) Auf den Seitenzugriffen haben Sie und wie oft Sie die Aufgabe ausführen möchten. Fügen Sie einfach einen Randomizer hinzu, um diese Funktion zu erreichen.

Sie können einfach eine Funktion wie diese verwenden.

if(Rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent.
    // Run the tasks system
}

Hoffe das hilft,

1
Tim Visée

Ich würde die Cronjobs mit www.guardiano.pm auslagern und jede X-Minute eine URL anrufen. Wenn Ihre URL (d. H. Www.yoursite.com/dothis.php) aufgerufen wird, führen Sie einen Code aus. Wenn Sie nicht möchten, dass das Web die Seite abfragt, wann Sie möchten, können Sie nur die Anforderung in POST zulassen und Parameter senden, die nur Sie mit guardiano.pm kennen 

Das ist, was ich tun würde, weil ich das bei meinen Lieblingsprojekten mache. Habe Spaß! 

1
Lorenzo Sinisi

Kommandozeile PHP + cron wäre der Weg, den ich gehen würde. Es ist einfach und sollte zur Rechnung passen. Es wird normalerweise mit PHP installiert.

0
Gavin M. Roy

Wenn Sie keine Möglichkeit haben, einen Cronjob einzurichten, können Sie das Skript mit cUrl aufrufen (alternativ zu wget - gleiche Funktionalität). Führen Sie einfach eine geplante Aufgabe auf Ihrem lokalen Computer aus, die die Funktion cUrl ausführt.

0
meeeeeh

Wenn Sie etwas abstrakteres suchen, sollten Sie vielleicht einen Scheduler mit PHP verwenden. Zum Beispiel: 

Um den cron-Ausdruck zu analysieren, können Sie auch eine vorhandene Bibliothek wie https://github.com/mtdowling/cron-expression verwenden. Es bietet viele nützliche Methoden, um Informationen über einen Cron-Job herauszufinden.

Hoffentlich hilft das.

0
XuDing