Rumah > pembangunan bahagian belakang > tutorial php > Analisis ringkas beberapa konfigurasi tamat masa dalam fail konfigurasi PHP

Analisis ringkas beberapa konfigurasi tamat masa dalam fail konfigurasi PHP

青灯夜游
Lepaskan: 2023-04-10 22:16:01
ke hadapan
5502 orang telah melayarinya

Artikel ini akan membincangkan tentang fail konfigurasi PHP dan menganalisis beberapa konfigurasi berkaitan tamat masa dalam fail konfigurasi (php.ini dan php-fpm.conf saya harap ia dapat membantu anda!

Analisis ringkas beberapa konfigurasi tamat masa dalam fail konfigurasi PHP

1. Gambaran Keseluruhan

Terdapat banyak konfigurasi berkaitan tamat masa dalam php.ini dan php-fpm.conf, jadi apakah sebenarnya yang dilakukan oleh konfigurasi ini? Bagaimanakah ia dilaksanakan dalam kod sumber? Artikel ini akan bercakap tentang konfigurasi tamat masa berikut:

php.ini
  • max_execution_time
  • max_input_time
php- fpm.conf
  • process_control_timeout
  • request_terminate_timeout
  • request_slowlog_timeout

Persekitaran berjalan:

2. Konfigurasikan peraturan penghuraian

peraturan penghuraian

Penghuraian php.ini selesai dalam peringkat

dan ini_entry berada dalam php_module_startup() untuk setiap Penghuraian peraturan yang ditakrifkan oleh konfigurasi php.ini, formatnya adalah seperti berikut: main.c

ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, arg1, arg2, arg3, displayer)
Salin selepas log masuk
PHP mentakrifkan banyak makro untuk pelbagai jenis konfigurasi,

ialah makro terakhir selepas ia dikembangkan, seperti ZEND_INI_ENTRY3_EXmakroPHP_INI_ENTRY

PHP_INI_ENTRY(name, default_value, modifiable, on_modify)
Salin selepas log masuk
Penjelasan parameter

nama: Nama konfigurasi

nilai_lalai: Nilai lalai konfigurasi

boleh diubah suai: Julat konfigurasi yang boleh ditetapkan

Mod ini menentukan bila, di mana dan sama ada arahan PHP boleh ditetapkan. Setiap arahan dalam manual mempunyai mod yang sesuai. Sebagai contoh, beberapa arahan boleh ditetapkan dalam skrip PHP menggunakan ini_set(), manakala arahan lain hanya boleh ditetapkan dalam php.ini atau httpd.conf.

Sebagai contoh, arahan output_buffering adalah milik

PHP_INI_PERDIR, jadi ia tidak boleh ditetapkan menggunakan ini_set(). Tetapi arahan display_errors adalah milik PHP_INI_ALL dan oleh itu boleh ditetapkan di mana-mana sahaja, termasuk ini_set().

Mod Maksud
PHP_INI_USER
模式 含义
PHP_INI_USER 可在用户脚本(例如 ini_set())或 Windows 注册表(自 PHP 5.3 起)以及 .user.ini 中设定
PHP_INI_PERDIR 可在 php.ini,.htaccess 或 httpd.conf 中设定
PHP_INI_SYSTEM 可在 php.ini 或 httpd.conf 中设定
PHP_INI_ALL 可在任何地方设定
Boleh ditetapkan dalam skrip pengguna (seperti ini_set()) atau Windows registry (sejak PHP 5.3 dan seterusnya) dan ditetapkan dalam .user.ini
PHP_INI_PERDIR Boleh ditetapkan dalam php.ini, .htaccess atau httpd.conf
PHP_INI_SYSTEM Boleh ditetapkan dalam php.ini atau httpd.conf
PHP_INI_ALL Boleh ditetapkan di mana-mana sahaja

on_modify: 配置修改函数

三、max_input_time、max_execution_time

因为max_input_timemax_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)
Salin selepas log masuk

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;
}
Salin selepas log masuk

设置超时定时器

// 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);
  }  
  ......
}
Salin selepas log masuk

从上面代码可以看到,如果设置了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
Analisis ringkas beberapa konfigurasi tamat masa dalam fail konfigurasi PHP

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进程接收到SIGINTSIGTERMSIGQUITSIGUSR2这些信号时,会调用fpm_pctl()来进行处理。

首先master进程会根据 接收到的信号 和 当前fpm的运行状态 来决定发送给worker进程的是SIGQUIT还是SIGTERM信号,同时注册时间为process_control_timeout的定时事件。

如果在process_control_timeout时间内子进程没有退出,那么master进程会升级SIGQUITSIGTERMSIGTERMSIGKILL,并注册1s的定时事件。SIGKILL就直接终止worker进程了,SIGTERM还能再给worker进程1s的时间。

综上,process_control_timeout可以理解为master进程留给worker进程结束自己的时间,要是到时间worker还没搞定那就开始master自己的策略了。

五、request_terminate_timeout、request_slowlog_timeout

因为request_terminate_timeoutrequest_slowlog_timeout 联系比较密切,所以放在一起来讲。

php-fpm.conf Penjelasan

request_terminate_timeout

; digunakan apabila pilihan 'max_execution_time'
; tidak menghentikan pelaksanaan skrip atas sebab tertentu. Nilai '0' bermaksud 'off'.
; ), h(ours) atau d(ays)
; Nilai Lalai: 0

Terjemahan: Tempoh tamat masa untuk melaksanakan permintaan, selepas itu proses pekerja akan ditamatkan. Pilihan ini harus digunakan

apabila pilihan ini gagal menghentikan pelaksanaan skrip atas sebab tertentu. max_execution_time

request_slowlog_timeout

; Tamat masa untuk menyampaikan satu permintaan selepas itu jejak balik PHP akan

dibuang ke fail 'slowlog'. .
; Unit tersedia: s(econds)(default), m(inutes), h(ours) atau d(ays)
; Nilai Lalai: 0

Terjemahan: Laksanakan permintaan tamat masa, selepas itu jejak balik PHP akan dikeluarkan kepada fail slowlog.

Analisis

dan request_slowlog_timeout digunakan dalam pengesanan degupan jantung proses induk (request_terminate_timeout Algoritma dipermudahkan masa degupan jantung fpm_pctl_heartbeat() ialah heartbeat

  • Apabila

    dihidupkan: request_terminate_timeoutrequest_terminate_timeout/1000*3

  • Apabila

    tidak dihidupkan: request_terminate_timeout atau 0request_slowlog_timeout/1000*3

  • request_terminate_timeout >= request_slowlog_timeout

Peraturan ketiga ialah memastikan slowlog tidak menjejaskan permintaan biasa,

1/3 daripada tamat masa hendaklah menjadi Untuk mengelakkan pengesanan degupan jantung terlalu kerap, kerana setiap pengesanan degupan jantung perlu merentasi semua proses pekerja. heartbeat

Jika peristiwa tamat masa berlaku, proses pekerja akan dimatikan secara langsung,

, dan kemudian kernel akan mengitar semula sumber dan menutup client_socket, dan nginx akan mengembalikan ralat 502 kepada penyemak imbas. kill(child_pid, SIGTERM);

Pembelajaran yang disyorkan: "

Tutorial Video PHP"

Atas ialah kandungan terperinci Analisis ringkas beberapa konfigurasi tamat masa dalam fail konfigurasi PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:segmentfault.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan