Ich schreibe ein PHP-Skript, das einige Back-End-Sachen macht und alle 8 Stunden oder so laufen muss. Das Skript benötigt eine Weile, um ausgeführt zu werden. Zum Teufel habe ich es aus meinem Browser versucht und die Verbindung zum Server wird zurückgesetzt, bevor das Skript beendet wird. Meine Frage ist - wenn ich es direkt ausführe, dh. php -a file.php als Cron-Job, gibt es interne Zeitbeschränkungen bei der Ausführung? Dieses Skript kann 2-5 Minuten dauern und kann nicht unterbrochen werden. Ich habe das vorher noch nie gemacht, also bin ich mir nicht sicher, ob php Macken hat, wenn er schwere Skripte ausführt.Ausführen von PHP-Skript als Cron-Job - Timeout-Probleme?
Antwort
Wie gesagt, CLI-Skripte standardmäßig keine zeitliche Begrenzung hat.
Aber ich möchte auch eine Alternative zu Ihrem Cron-Job-Ansatz erwähnen:
Sie können ein CLI-PHP-Skript aus einem PHP-Skript unter Webserver-Steuerung abzweigen. Ich habe das schon oft gemacht. Dies ist besonders nützlich, wenn Sie ein Skript mit langer Ausführungszeit haben, das von einer Benutzeraktion der Website ausgelöst werden muss (z. B. Erstellen einer sehr großen Archivdatei und Senden eines Downloadlinks per E-Mail, wenn die Datei vollständig ist). Normalerweise verzweige ich ein CLI-Skript von einem Webserver PHP-Skript mit der Funktion popen(). Dies ermöglicht es, schön Parameter auf die neue Skriptinstanz wie folgt zu übertragen:
$bgproc = popen('php "/my/path/my-bckgrnd-proc.php"', 'w');
if($bgproc===false){
die('Could not open bgrnd process');
}else{
// send params through stdin pipe to bgrnd process:
$p1 = serialize($param1);
$p2 = serialize($param2);
$p3 = serialize($param3);
fwrite($bgproc, $p1 . "\n" . $p2 . "\n" . $p3 . "\n");
pclose($bgproc);
}
Im CLI Skript Sie diese params wie diese erhalten würde ...
$fp = fopen('php://stdin', 'r');
$param1 = unserialize(fgets($fp));
$param2 = unserialize(fgets($fp));
$param3 = unserialize(fgets($fp));
fclose($fp);
... und tun alles, was mit ihnen das würde unter Webserverkontrolle lange dauern.
Diese Technik funktioniert gleichermaßen in * nix- und Windows-Umgebungen.
Sehr hilfreich, danke Jpsy. –
Nein, es gibt keine Zeitlimits in PHP selbst bei der Ausführung von PHP aus der Befehlszeile.
Aber es kann andere Timeouts, wie Verbindungen zu MySQL geben. Wenn Sie also eine mysql-Verbindung in Ihrem Code haben, stellen Sie sicher, dass sie am Leben bleibt, oder setzen Sie Ihr mysql-timeout auf einen Wert, der hoch genug ist, um Ihren Code auszuführen. Eine andere Sache: Ich habe einige Webhosting-Provider gesehen, die PHP-Apps, die mehr als ein paar Minuten laufen, kaputt machen. Stellen Sie also sicher, dass Ihr Provider das nicht tut.
Als Standard, PHP-Skripte Timeout nach 30 Sekunden, die durch Bearbeiten der PHP.ini oder durch Hinzufügen dieser oben im Skript überschrieben werden kann.
set_time_limit(0);
Dies setzt unbegrenzte Ausführungszeit an das Skript, das heißt, es endet nie, es wäre denn die Ausführung von Skripten zu beenden, oder der Server ausfällt, oder die Datei gelöscht wird oder ein fataler Fehler kommt.
Zusätzlich
Sie können diese zu Ihrem Skript hinzufügen und öffnen Sie sie in Ihrem Browser, um das Skript zu starten, und es wird ausgeführt, als ob Sie in einem Browser und halten Sie den Browser öffnen öffnen.
ignore_user_abort();
Es läuft einfach das Skript im Hintergrund. Diese beiden wären für Sie nützlich.
ADD: Wenn die Skripte von der Kommandozeile ausgeführt werden, Cli, das Standard-Timeout 0 ist (kein Timeout)
falsch, CLI-Skripte haben einen Standardwert von 0 ,. http://www.php.net/manual/en/features.commandline.differences.php –
Ok, Punkt genommen. Zu meinem Wissen hinzufügen, was hat dann 30 Sekunden als Standard-Timeout? – Kishor
"Nicht die Befehlszeile" hat einen Standardwert von 30. "Dies legt die maximale Zeit in Sekunden fest, die ein Skript ausführen darf, bevor es vom Parser beendet wird. Dies verhindert, dass schlecht geschriebene Skripts den Server binden. Die Standardeinstellung 30. Wenn PHP über die Befehlszeile ausgeführt wird, ist die Standardeinstellung 0. "http://www.php.net/manual/en/info.configuration.php#ini.max-input-time –
- 1. cronjob Ausführen einer PHP-Datei
- 2. Ausführen von Ruby Selen Scripts auf Cronjob - Chrome
- 3. PHP ob_ * von Cronjob?
- 4. Cronjob Speicher von Dateien
- 5. Führe Cronjob als eingeloggter Benutzer aus
- 6. AWS arbeitet nicht von Cronjob
- 7. Stündliche Cronjob unter Windows
- 8. So verwenden Sie Cronjob
- 9. Git automatisch ziehen mit Cronjob
- 10. Ausführen von Modulen als Skripte
- 11. Ausführen von Text als Abfrage
- 12. Bash-Skript aus Bash-Skript als Cronjob starten
- 13. Wie führe ich einen Befehl als ein anderer Benutzer von einem Root-Cronjob aus?
- 14. cronjob in asp C#
- 15. Rake nicht richtig in Cronjob
- 16. Cronjob läuft nicht php Dokument
- 17. Aufruf einer Codeigniter-Steuerung von Cronjob
- 18. Mehrere Cronjob-E-Mails
- 19. Cronjob oder MySQL Event?
- 20. Cronjob zum Erkennen der zuletzt geänderten Dateien
- 21. cronjob in codeigniter mit cpanel
- 22. Problem läuft Kuchen Shell in Cronjob
- 23. Crontab - Führen Sie einen Cronjob vierteljährlich
- 24. Run-Shell-Skript genau einmal mit Cronjob
- 25. Cronjob hinzugefügt, aber nicht funktioniert
- 26. Running Casperjs per Cronjob auf Heroku
- 27. Ausführen von LambdaExpression und Rückgabewert als Objekt
- 28. Batch: Ausführen als Administrator von zugeordnetem Netzlaufwerk
- 29. Wie VBS als Administrator von Vbs ausführen?
- 30. Ausführen von exec als anderer Benutzer
Überprüfen Sie [set_time_limit] (http://php.net/manual/en/function.set-time-limit.php) – Vatev
CLI namens PHP-Skripte haben kein Zeitlimit.Ein geteilter Host kann jedoch den Prozess stoppen, der mehr als X Sekunden dauert - wie wird das gehostet? –
Siehe: http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time, es gibt kein Zeitlimit in CLI –