Cet article parlera des fichiers de configuration PHP et analysera plusieurs configurations liées aux délais d'attente dans les fichiers de configuration (php.ini et php-fpm.conf. J'espère que cela pourra vous aider !
Il existe de nombreuses configurations liées aux délais d'attente dans php.ini et php-fpm.conf, alors à quoi servent exactement ces configurations ? Comment est-il implémenté dans le code source ? Cet article parlera des configurations de délai d'attente suivantes :
Environnement d'exécution : Mac 10.14.2 + PHP 7.3.7
L'analyse de php.ini est terminée dans l'étape php_module_startup()
, ini_entry est dans main Les règles d'analyse définies pour chaque configuration php.ini en .c
sont au format suivant : 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
est le résultat final après sont des macros développées, telles que la macro PHP_INI_ENTRY
// 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)
nom :
Nom de la configurationvaleur_default :
Valeur par défaut de la configurationmodifiable :
Plage de configuration pouvant être définieCes modes déterminent quand, où et si une commande PHP peut être définie. Chaque instruction du manuel possède un mode auquel elle appartient. Par exemple, certaines instructions peuvent être définies dans les scripts PHP en utilisant ini_set(), tandis que d'autres ne peuvent être définies que dans php.ini ou httpd.conf.Par exemple, la commande output_buffering appartient à PHP_INI_PERDIR, elle ne peut donc pas être définie à l'aide de ini_set(). Mais la directive display_errors appartient à PHP_INI_ALL
et peut être définie n'importe où, y compris ini_set().义 Modesignifiant
PHP_INI_PERDIR Php_ini_user PHP_INI_SYSTEM peut être défini dans php.ini, .htaccess ou httpd.conf PHP_INI_ALL peut être défini dans php.ini ou httpd .conf Peut être défini n'importe où 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)Copier après la connexionCopier après la connexion
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; }Copier après la connexion设置超时定时器
// 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); } ...... }Copier après la connexion从上面代码可以看到,如果设置了
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 Explication
request_terminate_timeout
; Le délai d'attente pour traiter une seule requête après lequel le processus de travail sera arrêté
; Cette option doit être utilisée lorsque l'option ini 'max_execution_time'
; exécution pour une raison quelconque. Une valeur de '0' signifie 'off'.
; Unités disponibles : s(econdes)(par défaut), m(inutes), h(ours) ou d(ays)
;Traduction : le délai d'attente pour l'exécution d'une requête, après lequel le processus de travail sera terminé. Cette option doit être utilisée lorsque l'option ini
max_execution_time
ne parvient pas à arrêter l'exécution du script pour une raison quelconque.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进程,
request_slowlog_timeoutkill(child_pid, SIGTERM);
; Le délai d'attente pour traiter une seule requête après lequel une trace PHP sera transférée dans le fichier 'slowlog'. Une valeur de '0s' signifie 'off'. ; (par défaut), m(inutes), h(ours) ou d(ays)
; Valeur par défaut : 0🎜🎜Traduction : le délai d'attente pour l'exécution d'une requête, après quoi une trace PHP sera générée dans le fichier slowlog. 🎜🎜Analysis🎜🎜request_slowlog_timeout
etrequest_terminate_timeout
sont utilisés dans la détection du rythme cardiaque du processus maître (fpm_pctl_heartbeat()
), et le temps de battement de coeurheartbeat L'algorithme simplifié est 🎜🎜La troisième règle est de garantir que le slowlog n'affecte pas les requêtes normales,
- 🎜Lorsque
request_terminate_timeout
est activé :request_terminate_timeout/ 1000*3
🎜- 🎜Lorsque
🎜request_terminate_timeout
n'est pas activé :request_slowlog_timeout/1000*3
ou 0🎜request_terminate_timeout >= request_slowlog_timeout
🎜heartbeat
prend le délai d'attente d'un tiers du temps doit permettre d'éviter une détection de battement de cœur trop fréquente, car chaque détection de battement de cœur doit traverser tous les processus de travail. 🎜🎜Si un événement de délai d'attente se produit, le processus de travail sera tué directement,kill(child_pid, SIGTERM);
, puis le noyau recyclera les ressources et fermera le client_socket, et nginx renverra une erreur 502 au navigateur. 🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo PHP🎜"🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Article précédent:Parlons du mécanisme de communication entre Nginx et php-fpm et voyons comment le configurer ? Article suivant:Résumer les bases des objets PHPDéclaration de ce site WebLe contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cnDerniers articles par auteur
2023-04-26 17:59:18 2023-04-26 17:47:48 2023-04-26 17:41:42 2023-04-26 17:37:05 2023-04-26 17:31:25 2023-04-26 17:27:32 2023-04-25 19:57:58 2023-04-25 19:53:11 2023-04-25 19:49:11 2023-04-25 19:41:54Derniers numérosProblèmes rencontrés lors de l'utilisation d'opentbs pour générer des fichiers odt : les valeurs d'une même clé sont affichées dans la même ligne au lieu de colonnes séparées. J'utilise une bibliothèque appelée OpenTbs pour créer odt en utilisant PHP, je l'utilise c...Depuis 2024-04-06 20:18:1801483Rubriques connexesPlus>
- Comment ouvrir le fichier php
- Comment supprimer les premiers éléments d'un tableau en php
- Que faire si la désérialisation php échoue
- Comment connecter PHP à la base de données mssql
- Comment connecter PHP à la base de données mssql
- Comment télécharger du HTML
- Comment résoudre les caractères tronqués en PHP
- Comment ouvrir des fichiers php sur un téléphone mobile