Heim  >  Artikel  >  Backend-Entwicklung  >  PHPs set_time_out- und max_execution_time-Einstellungen

PHPs set_time_out- und max_execution_time-Einstellungen

不言
不言Original
2018-04-26 14:27:532922Durchsuche

Dieser Artikel stellt Ihnen die Einstellungen set_time_out und max_execution_time von PHP vor. Freunde in Not können darauf zurückgreifen.


Absicht


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.

Ich dachte ursprünglich, der Code wäre so

<?phpini_set("max_execution_time",5);
set_time_limit(5);for($i=0;$i<=10;$i++)
{echo $i."\n";
sleep(1);
}

Aber das Ergebnis unter cli ist

012345678910

Das Gleiche gilt für fpm.

Dinge, über die Sie nachdenken sollten

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]FParameter

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 Folgenden

main.c

Schauen wir uns die Schlüsselzeile an
/* {{{ 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

, dann suchen Sie im Zend-Verzeichnis nach zend_set_timeout und finden Sie dann ITIMER_PROF
        }        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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn