it-swarm.com.de

Setze max_execution_time in PHP CLI

Ich weiß, dass PHP CLI normalerweise wegen fehlender Zeitlimits und primär verwendet wird, da Apache-ThreadsProzesse nicht verwendet werden.

Aber gibt es eine Möglichkeit, die max_execution_time für einige Skripte explizit festzulegen, die ich nicht frei von "unbegrenzter Zeit" haben möchte und diese Skripts nur unter Kontrolle halten möchte?

Wenn Sie der Meinung sind, dass diese Frage auf superuser.com besser beantwortet werden kann, haben Sie die Berechtigung, sie zu verschieben. :)

/ - Edit : Ich habe ein bisschen gegoogelt und den richtigen Parameter gefunden:

php -d max_execution_time=5 script.php
38
Radek Simko

Die Dokumentation besagt, dass im Befehlszeilenmodus der Standardwert 0 (unbegrenzt) ist. Es heißt nicht, dass Sie es nicht überschreiben können:

set_time_limit(10); // this way
ini_set('max_execution_time', 10); // or this way

Edit: Ich habe es gerade selbst ausprobiert und es funktioniert wie erwartet.

F:\dev\www>c:php -f index.php
PHP Fatal error:  Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3

Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
34
Jon

set_time_limit () funktioniert in CLI-Skripten.

<?php 
set_time_limit(1); //in seconds
for (;;);
?>

Nach einer Sekunde wird mit der folgenden Fehlermeldung angezeigt:

PHP Fatal error:  Maximum execution time of 1 second exceeded in \
/home/stivlo/test.php on line 4

Anfangs habe ich es mit sleep () versucht und das Zeitlimit wird nicht angewendet. Wie @Jon vorschlug, funktioniert eine echte Berechnung, wie eine Endlosschleife.

Ich habe diesen interessanten Kommentar auf der Seite sleep () PHP gefunden: 

Hinweis: Die Funktion set_time_limit () und die Konfigurationsanweisung max_execution_time wirken sich nur auf die Ausführungszeit des Skripts aus. Jede Zeit, die für Aktivitäten außerhalb der Skriptausführung aufgewendet wird, z. B. Systemaufrufe mit system (), die Funktion sleep (), Datenbankabfragen usw., ist nicht enthalten, wenn die maximale Zeitdauer des Skripts festgelegt wird Laufen

20
stivlo

Ich habe ein ähnliches Problem. In meinem Fall hatte ich jedoch Remote-Datenbankaufrufe, die viel Zeit in Anspruch nahmen, und ich wollte das Skript nach einiger Zeit beenden. Wie in den anderen Antworten erwähnt, werden externe Anrufe (oder sleep()) nicht für die konfigurierte Zeitlimiteinstellung berücksichtigt. 

Mein Ansatz bestand also darin, die Skripte pid herauszufinden und dann nach einem Ruhezustand einen kill -9-Befehl auszuführen. Hier ist ein grundlegendes Beispiel:

$cmd = "(sleep 10  && kill -9 ".getmypid().") > /dev/null &";
exec($cmd); //issue a command to force kill this process in 10 seconds

$i=0;
while(1){
    echo $i++."\n";
    sleep(1); //simulating a query
}

Beachten Sie, dass es möglich ist, dass Ihr Skript schön endet und ein neues, anderes Skript mit derselben PID startet, die dieser Kill-Befehl beenden würde. Das ist unwahrscheinlich, aber Sie sollten dies als Möglichkeit in Betracht ziehen, wenn Sie diesen Ansatz verwenden.

1
Landon

Verwenden Sie set_time_limit function.

0
Timofey Stolbov