2012-11-12 13 views
14

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?

+1

Überprüfen Sie [set_time_limit] (http://php.net/manual/en/function.set-time-limit.php) – Vatev

+1

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? –

+0

Siehe: http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time, es gibt kein Zeitlimit in CLI –

Antwort

24

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.

+0

Sehr hilfreich, danke Jpsy. –

4

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.

3

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)

+4

falsch, CLI-Skripte haben einen Standardwert von 0 ,. http://www.php.net/manual/en/features.commandline.differences.php –

+0

Ok, Punkt genommen. Zu meinem Wissen hinzufügen, was hat dann 30 Sekunden als Standard-Timeout? – Kishor

+2

"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 –