


Eine kurze Analyse mehrerer Timeout-Konfigurationen in PHP-Konfigurationsdateien
In diesem Artikel geht es um PHP-Konfigurationsdateien und die Analyse mehrerer Timeout-bezogener Konfigurationen in den Konfigurationsdateien (php.ini und php-fpm.conf). Ich hoffe, er kann Ihnen helfen!
1. Übersicht
Es gibt viele Timeout-bezogene Konfigurationen in php.ini und php-fpm.conf. Was genau bewirken diese Konfigurationen? Wie ist es im Quellcode implementiert? In diesem Artikel geht es um die folgenden Timeout-Konfigurationen:
php.ini
- max_execution_time
- max_input_time
php-fpm.conf
- process_control_timeout
- request_terminate_timeout
- request_slowlog_ Timeout
Laufumgebung: Mac 10.14.2 + PHP 7.3.7
2. Parsing-Regeln konfigurieren
Parsing-Regeln
Das Parsen von php.ini wird in der Phase php_module_startup()
abgeschlossen, ini_entry befindet sich in main Die in .c
definierten Parsing-Regeln für jede php.ini-Konfiguration haben das folgende Format: php_module_startup()
阶段完成,ini_entry是在 main.c
中为每个php.ini配置定义的解析规则,格式如下:
ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, arg1, arg2, arg3, displayer)
PHP为不同类型的配置定义了很多宏,ZEND_INI_ENTRY3_EX
是它们展开后的最终宏,比如PHP_INI_ENTRY
PHP_INI_ENTRY(name, default_value, modifiable, on_modify)
ZEND_INI_ENTRY3_EX
ist das Endergebnis danach Sie sind erweiterte Makros, wie zum Beispiel das PHP_INI_ENTRY
-Makro // max_input_time,默认值为无限制
STD_PHP_INI_ENTRY("max_input_time", "-1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLong, max_input_time, php_core_globals, core_globals)
// max_execution_time,默认值为30s,修改函数为OnUpdateTimeout
PHP_INI_ENTRY("max_execution_time", "30", PHP_INI_ALL, OnUpdateTimeout)
Nach dem Login kopierenNach dem Login kopieren
Parametererklärung// max_input_time,默认值为无限制 STD_PHP_INI_ENTRY("max_input_time", "-1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLong, max_input_time, php_core_globals, core_globals) // max_execution_time,默认值为30s,修改函数为OnUpdateTimeout PHP_INI_ENTRY("max_execution_time", "30", PHP_INI_ALL, OnUpdateTimeout)
Name:
KonfigurationsnameStandardwert:
Konfigurationsstandardwertmodifizierbar:
Konfigurationsbereich, der eingestellt werden kannDiese Modi legen fest, wann, wo und ob ein PHP-Befehl gesetzt werden kann. Jede Anweisung im Handbuch hat einen Modus, zu dem sie gehört. Beispielsweise können einige Befehle in PHP-Skripten mit ini_set() festgelegt werden, während andere nur in php.ini oder httpd.conf festgelegt werden können.Zum Beispiel gehört der Befehl „output_buffering“ zu PHP_INI_PERDIR und kann daher nicht mit ini_set() festgelegt werden. Aber die display_errors-Direktive gehört zu PHP_INI_ALL
und kann überall gesetzt werden, einschließlich ini_set().义 Modusbedeutet
PHP_INI_PERDIR Php_ini_user PHP_INI_SYSTEM kann in php.ini, .htaccess oder httpd.conf eingestellt werden PHP_INI_ALL kann in php.ini oder httpd eingestellt werden .conf Kann überall eingestellt werden on_modify: 配置修改函数
三、max_input_time、max_execution_time
因为
max_input_time
和max_execution_time
联系比较密切,所以放在一起来讲。php.ini 解释
max_input_time
; Maximum amount of time each script may spend parsing request data. It's a good
; idea to limit this time on productions servers in order to eliminate unexpectedly
; long running scripts.
; Note: This directive is hardcoded to -1 for the CLI SAPI
; http://php.net/max-input-time翻译过来就是:
max_input_time
是每个脚本可以花在解析请求数据上的最大时间。在生产服务器上通过限制max_input_time可以清除掉长时间运行的脚本。在CLI模式下会硬编码为-1,即无限制。max_execution_time
; Maximum execution time of each script, in seconds
; http://php.net/max-execution-...
; Note: This directive is hardcoded to 0 for the CLI SAPI翻译:
max_execution_time
是每个脚本的最大可执行时间。在CLI模式下硬编码为0配置解析规则
// max_input_time,默认值为无限制 STD_PHP_INI_ENTRY("max_input_time", "-1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLong, max_input_time, php_core_globals, core_globals) // max_execution_time,默认值为30s,修改函数为OnUpdateTimeout PHP_INI_ENTRY("max_execution_time", "30", PHP_INI_ALL, OnUpdateTimeout)Nach dem Login kopierenNach dem Login kopieren
OnUpdateTimeout()
函数如下,由第二节可知配置解析发生在php_module_startup()
阶段,此时EG(timeout_seconds)
被赋值为了max_execution_time
,但还没有设置定时器。// main.c static PHP_INI_MH(OnUpdateTimeout) { if (stage==PHP_INI_STAGE_STARTUP) { /* Don't set a timeout on startup, only per-request */ /* EG(timeout_seconds) = max_execution_time */ ZEND_ATOL(EG(timeout_seconds), ZSTR_VAL(new_value)); return SUCCESS; } zend_unset_timeout(); ZEND_ATOL(EG(timeout_seconds), ZSTR_VAL(new_value)); zend_set_timeout(EG(timeout_seconds), 0); return SUCCESS; }Nach dem Login kopieren设置超时定时器
// main.c int php_request_startup(void) { ...... if (PG(max_input_time) == -1) { zend_set_timeout(EG(timeout_seconds), 1); } else { zend_set_timeout(PG(max_input_time), 1); } ...... } int php_execute_script(zend_file_handle *primary_file) { ...... if (PG(max_input_time) != -1) { zend_set_timeout(INI_INT("max_execution_time"), 0); } ...... }Nach dem Login kopieren从上面代码可以看到,如果设置了
max_input_time
(即值不等于-1,-1可以认为是在CLI模式下),在php_request_startup()
阶段会设置一个定时器,超时时间为max_input_time
;在php_execute_script()
阶段会重新设置一个定时器,超时时间为max_execution_time
。那么整个PHP脚本执行的最大执行时间就等于max_input_time
+max_execution_time
。如果没有设置
max_input_time
的话(即值等于-1),在php_request_startup()
阶段也会设置一个定时器,但超时时间被设为了EG(timeout_seconds)
,而EG(timeout_seconds)
已经在php_module_startup()
阶段被赋值为max_execution_time
,所以此时的超时时间就是max_execution_time
;在php_execute_script()
阶段不会重新设置定时器,前一阶段设置的max_execution_time
定时器仍然生效着。那么整个PHP脚本的最大执行时间就是max_execution_time
。
zend_set_time()
使用setitimer(ITIMER_PROF, &t_r, NULL);
来实现定时器,ITIMER_PROF
会统计包括用户态和内核态下所花费的时间,而像sleep()
这样的系统调用会让进程挂起,不占用cpu时间片,所以这俩超时时间是不包括sleep()
时间的。当定时器到时间后,ZendVM会抛出
E_ERROR
,即Fatal error
错误。四、process_control_timeout
php-fpm.conf 解释
; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds翻译:
process_control_timeout
是留给子进程处理来自master进程信号的时间限制。分析
当master进程接收到
SIGINT
、SIGTERM
、SIGQUIT
、SIGUSR2
这些信号时,会调用fpm_pctl()
来进行处理。首先master进程会根据 接收到的信号 和 当前fpm的运行状态 来决定发送给worker进程的是
SIGQUIT
还是SIGTERM
信号,同时注册时间为process_control_timeout
的定时事件。如果在
process_control_timeout
时间内子进程没有退出,那么master进程会升级SIGQUIT
为SIGTERM
,SIGTERM
为SIGKILL
,并注册1s的定时事件。SIGKILL
就直接终止worker进程了,SIGTERM
还能再给worker进程1s的时间。综上,
process_control_timeout
可以理解为master进程留给worker进程结束自己的时间,要是到时间worker还没搞定那就开始master自己的策略了。五、request_terminate_timeout、request_slowlog_timeout
因为
request_terminate_timeout
和request_slowlog_timeout
联系比较密切,所以放在一起来讲。php-fpm.conf Erläuterung
request_terminate_timeout
; Das Zeitlimit für die Bearbeitung einer einzelnen Anfrage
; Diese Option sollte verwendet werden, wenn die INI-Option „max_execution_time“ nicht gestoppt wird Ausführung aus irgendeinem Grund. Ein Wert von „0“ bedeutet „aus“.
; Verfügbare Einheiten: Sekunden (Standard), Stunden (Stunden) oder Tage (Tage) ;
Übersetzung: Der Timeout-Zeitraum für die Ausführung einer Anfrage, nach dem der Arbeitsprozess beendet wird. Diese Option sollte verwendet werden, wenn die INI-Optionmax_execution_time
aus irgendeinem Grund die Skriptausführung nicht stoppen kann.request_slowlog_timeout
max_execution_time
这个ini选项由于某些原因不能停止脚本执行的时候。request_slowlog_timeout
; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0翻译:执行一个请求的超时时间,在这之后一个PHP的backtrace会被输出到slowlog文件里。
分析
request_slowlog_timeout
和request_terminate_timeout
用在master进程的心跳检测中(fpm_pctl_heartbeat()
),心跳时间heartbeat
简化后的算法是
在开启
request_terminate_timeout
情况下:request_terminate_timeout/1000*3
在未开启
request_terminate_timeout
情况下:request_slowlog_timeout/1000*3
或者 0
request_terminate_timeout >= request_slowlog_timeout
第三条规则是为了保证slowlog不影响到正常的请求,
heartbeat
取超时时间的1/3应该是为了避免心跳检测过于频繁,因为每次心跳检测都需要遍历所有worker进程。如果超时事件发生了,那么将直接kill掉worker进程,
; Die Zeitüberschreitung für die Bearbeitung einer einzelnen Anfragekill(child_pid, SIGTERM);
; Ein Wert von „0s“ bedeutet „aus“.; (Standard), m(inutes), h(ours) oder d(ays); Standardwert: 0
🎜Übersetzung: Der Timeout-Zeitraum für die Ausführung einer Anfrage, nach dem ein PHP-Backtrace in die Slowlog-Datei ausgegeben wird. 🎜🎜Analysis🎜🎜request_slowlog_timeout
undrequest_terminate_timeout
werden bei der Heartbeat-Erkennung des Master-Prozesses (fpm_pctl_heartbeat()
) verwendet die Heartbeat-Zeitheartbeat Der vereinfachte Algorithmus ist 🎜🎜Die dritte Regel besteht darin, sicherzustellen, dass Slowlog keine Auswirkungen auf normale Anfragen hat,
- 🎜Wenn
request_terminate_timeout
aktiviert ist:request_terminate_timeout/ 1000*3
🎜- 🎜Wenn
🎜request_terminate_timeout
nicht aktiviert ist:request_slowlog_timeout/1000*3
oder 0🎜request_terminate_timeout >= request_slowlog_timeout
🎜heartbeat
dauert Die Zeitüberschreitung sollte 1/3 der Zeit betragen, um eine zu häufige Heartbeat-Erkennung zu vermeiden, da jede Heartbeat-Erkennung alle Arbeitsprozesse durchlaufen muss. 🎜🎜Wenn ein Timeout-Ereignis auftritt, wird der Arbeitsprozess direkt beendet,kill(child_pid, SIGTERM);
, und dann recycelt der Kernel Ressourcen und schließt den client_socket, und nginx gibt einen 502-Fehler zurück zum Browser. 🎜🎜Empfohlenes Lernen: „🎜PHP-Video-Tutorial🎜“🎜Das obige ist der detaillierte Inhalt vonEine kurze Analyse mehrerer Timeout-Konfigurationen in PHP-Konfigurationsdateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Erklärung dieser WebsiteDer 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![]()
Heiße KI -Werkzeuge
![]()
Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos
![]()
AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.
![]()
Undress AI Tool
Ausziehbilder kostenlos
![]()
Clothoff.io
KI-Kleiderentferner
![]()
AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.
![]()
Heißer Artikel
Assassin's Creed Shadows: Seashell Riddle -Lösung3 Wochen vor By DDDWas ist neu in Windows 11 KB5054979 und wie Sie Update -Probleme beheben2 Wochen vor By DDDWo kann man die Kransteuerungsschlüsselkarten in Atomfall finden3 Wochen vor By DDDErsparnis in R.E.P.O. Erklärt (und speichern Dateien)1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌![]()
Heiße Werkzeuge
![]()
Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor
![]()
SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen
![]()
Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung
![]()
Dreamweaver CS6
Visuelle Webentwicklungstools
![]()
SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)
![]()
Heiße Themen
CakePHP-Tutorial1386
52
See all articlesPHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM
PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.
So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM
Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c
7 PHP-Funktionen, die ich leider vorher nicht kannte Nov 13, 2024 am 09:42 AM
Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen
Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM
Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet
Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM
JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.
PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM
Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan
Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM
Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.
Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM
Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.
![]()