Heim > Artikel > Backend-Entwicklung > PHPs set_time_out- und max_execution_time-Einstellungen
Dieser Artikel stellt Ihnen die Einstellungen set_time_out und max_execution_time von PHP vor. Freunde in Not können darauf zurückgreifen.
Ich möchte, dass ein PHP-Skript (unter fpm oder cli) nur 5 bis set_time_out oder max_execution_time ausführt Einstellungen Zweitens.
<?phpini_set("max_execution_time",5); set_time_limit(5);for($i=0;$i<=10;$i++) {echo $i."\n"; sleep(1); }
012345678910
Das Gleiche gilt für fpm.
Lesen Sie zuerst die manuelle Funktion. Die Zusammenfassung lautet wie folgt:
Die Funktion set_time_limit() und die Konfigurationsanweisung max_execution_time wirken sich nur auf die Ausführungszeit von aus das Skript selbst. Die maximale Zeit für die Ausführung eines Skripts wie Systemaufrufe mit system(), Stream-Operationen, Datenbankoperationen usw. wird nicht berücksichtigt, wenn das Skript bereits ausgeführt wird. Unter Windows, wo gemessene Zeiten reale Werte sind, ist dies nicht der Fall.
Immer noch verwirrt.
Hab auch einen anderen Satz gesehen:
Wenn PHP im abgesicherten Modus ausgeführt wird, kann diese Funktion nicht wirksam werden. Es gibt keine andere Möglichkeit, als den abgesicherten Modus auszuschalten oder das Zeitlimit in php.ini zu ändern.
Ich habe einen besonderen Blick darauf geworfen und es war kein abgesicherter Modus. .
Dann war ich verwirrt und erhielt eine geduldige Antwort vom Beamten.
Die PHP-Zend-Engine implementiert max_execute_time mithilfe eines Settimers, und der Parameter ist ITIMER_PROF (was bedeutet, dass nur die vom Benutzermodus und Kernelmodus verbrauchte Echtzeit berechnet wird).
Der Ruhezustand unterbricht den Prozess jedoch für einen Zeitraum von Es wird keine Operation ausgeführt und es wird keine Zeit verbraucht, sodass dieser Ruhezustand weder Kernelzeit noch Benutzerzeit verbraucht.
Ich habe ein C-Programm geschrieben, um es zu überprüfen. Im Ruhezustand gibt es überhaupt keine Zeitstatistik und der Signalhandler wird nicht ausgelöst.
Dann werde ich das verfolgen [ITIMER_PRO][3]F
Parameter
Beschreibung
Das System stellt jedem Prozess drei Intervall-Timer zur Verfügung, die jeweils in einem bestimmten Zeitbereich dekrementieren. Wenn ein Timer abläuft, wird ein Signal an den Prozess gesendet und der Timer startet (möglicherweise) neu .
ITIMER_REAL
dekrementiert in Echtzeit und liefert SIGALRM bei Ablauf.
ITIMER_VIRTUAL
dekrementiert nur, wenn der Prozess ausgeführt wird, und liefert SIGVTALRM bei Ablauf
Erniedrigt sich sowohl bei der Ausführung des Prozesses als auch bei der Ausführung durch das System. In Verbindung mit ITIMER_VIRTUAL wird dieser Timer normalerweise verwendet, um die von der Anwendung im Benutzer- und Kernelbereich verbrachte Zeit zu profilieren Ablauf.
Sehen Sie sich den Prozess an, der in der Option ITIMER_PROF ausgeführt wird. Ist es nicht die Ausführung des PHP-Prozesses? Es gibt kein Problem mit der Prozessausführung, aber die Ruhefunktion unterbricht den Prozess, sodass der Inhalt im Ruhezustand nicht gezählt wird. Daher beträgt die Ausführungszeit im Benutzermodus die ganze Zeit, außer nach dem Schlafen
Wenn es einen bestimmten Unterschied gibt, wie spiegelt er sich im Quellcode wider? Verfolgen Sie erneut
und
zum Folgendenmain.c
/* {{{ proto bool set_time_limit(int seconds) Sets the maximum time a script can run */PHP_FUNCTION(set_time_limit) { zend_long new_timeout; char *new_timeout_str; int new_timeout_strlen; zend_string *key; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &new_timeout) == FAILURE) { return; } new_timeout_strlen = (int)zend_spprintf(&new_timeout_str, 0, ZEND_LONG_FMT, new_timeout); key = zend_string_init("max_execution_time", sizeof("max_execution_time")-1, 0); if (zend_alter_ini_entry_chars_ex(key, new_timeout_str, new_timeout_strlen, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0) == SUCCESS) { RETVAL_TRUE; } else { RETVAL_FALSE; } zend_string_release(key); efree(new_timeout_str); }
und verfolgen Sie dann max_execution_timesizeof("max_execution_time")
oder gehen Sie zu main.c Weiter , es gibt
} if (PG(max_input_time) != -1) {#ifdef PHP_WIN32 zend_unset_timeout();#endif zend_set_timeout(INI_INT("max_execution_time"), 0); }
Er ist es!
Das obige ist der detaillierte Inhalt vonPHPs set_time_out- und max_execution_time-Einstellungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!