真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP文件中怎么配置超時(shí)時(shí)間

今天小編給大家分享一下PHP文件中怎么配置超時(shí)時(shí)間的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

“專(zhuān)業(yè)、務(wù)實(shí)、高效、創(chuàng)新、把客戶(hù)的事當(dāng)成自己的事”是我們每一個(gè)人一直以來(lái)堅(jiān)持追求的企業(yè)文化。 創(chuàng)新互聯(lián)是您可以信賴(lài)的網(wǎng)站建設(shè)服務(wù)商、專(zhuān)業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專(zhuān)注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、軟件開(kāi)發(fā)、設(shè)計(jì)服務(wù)業(yè)務(wù)。我們始終堅(jiān)持以客戶(hù)需求為導(dǎo)向,結(jié)合用戶(hù)體驗(yàn)與視覺(jué)傳達(dá),提供有針對(duì)性的項(xiàng)目解決方案,提供專(zhuān)業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場(chǎng),引領(lǐng)市場(chǎng)!

PHP文件中怎么配置超時(shí)時(shí)間

一、概要

php.ini 和 php-fpm.conf 中有很多超時(shí)相關(guān)的配置,那么這些配置到底有什么作用呢?在源碼中又是怎么實(shí)現(xiàn)的呢?這篇文章就來(lái)講講下面幾種超時(shí)配置:

php.ini
  • max_execution_time

  • max_input_time

php-fpm.conf
  • process_control_timeout

  • request_terminate_timeout

  • request_slowlog_timeout

運(yùn)行環(huán)境:Mac 10.14.2 + PHP 7.3.7

二、配置解析規(guī)則

解析規(guī)則

php.ini的解析是在php_module_startup()階段完成,ini_entry是在 main.c 中為每個(gè)php.ini配置定義的解析規(guī)則,格式如下:

ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, arg1, arg2, arg3, displayer)

PHP為不同類(lèi)型的配置定義了很多宏,ZEND_INI_ENTRY3_EX 是它們展開(kāi)后的最終宏,比如PHP_INI_ENTRY

PHP_INI_ENTRY(name, default_value, modifiable, on_modify)
參數(shù)解釋

name:配置名稱(chēng)

default_value:配置默認(rèn)值

modifiable:配置的可被設(shè)定范圍

這些模式?jīng)Q定著一個(gè) PHP 的指令在何時(shí)何地,是否能夠被設(shè)定。手冊(cè)中的每個(gè)指令都有其所屬的模式。例如有些指令可以在 PHP 腳本中用 ini_set() 來(lái)設(shè)定,而有些則只能在 php.ini 或 httpd.conf 中。

例如 output_buffering 指令是屬于 PHP_INI_PERDIR,因而就不能用 ini_set() 來(lái)設(shè)定。但是 display_errors 指令是屬于 PHP_INI_ALL 因而就可以在任何地方被設(shè)定,包括 ini_set()。

模式含義
PHP_INI_USER可在用戶(hù)腳本(例如 ini_set())或 Windows 注冊(cè)表(自 PHP 5.3 起)以及 .user.ini 中設(shè)定
PHP_INI_PERDIR可在 php.ini,.htaccess 或 httpd.conf 中設(shè)定
PHP_INI_SYSTEM可在 php.ini 或 httpd.conf 中設(shè)定
PHP_INI_ALL可在任何地方設(shè)定

on_modify:配置修改函數(shù)

三、max_input_time、max_execution_time

因?yàn)?code>max_input_time 和 max_execution_time 聯(lián)系比較密切,所以放在一起來(lái)講。

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

翻譯過(guò)來(lái)就是:max_input_time是每個(gè)腳本可以花在解析請(qǐng)求數(shù)據(jù)上的最大時(shí)間。在生產(chǎn)服務(wù)器上通過(guò)限制max_input_time可以清除掉長(zhǎng)時(shí)間運(yùn)行的腳本。在CLI模式下會(huì)硬編碼為-1,即無(wú)限制。

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是每個(gè)腳本的最大可執(zhí)行時(shí)間。在CLI模式下硬編碼為0

配置解析規(guī)則
// max_input_time,默認(rèn)值為無(wú)限制
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,默認(rèn)值為30s,修改函數(shù)為OnUpdateTimeout
PHP_INI_ENTRY("max_execution_time", "30",    PHP_INI_ALL, OnUpdateTimeout)

OnUpdateTimeout()函數(shù)如下,由第二節(jié)可知配置解析發(fā)生在php_module_startup()階段,此時(shí)EG(timeout_seconds)被賦值為了max_execution_time,但還沒(méi)有設(shè)置定時(shí)器。

// 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;
}
設(shè)置超時(shí)定時(shí)器
// 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);
  }  
  ......
}

從上面代碼可以看到,如果設(shè)置了max_input_time(即值不等于-1,-1可以認(rèn)為是在CLI模式下),在php_request_startup()階段會(huì)設(shè)置一個(gè)定時(shí)器,超時(shí)時(shí)間為max_input_time;在php_execute_script()階段會(huì)重新設(shè)置一個(gè)定時(shí)器,超時(shí)時(shí)間為max_execution_time。那么整個(gè)PHP腳本執(zhí)行的最大執(zhí)行時(shí)間就等于max_input_time + max_execution_time。

如果沒(méi)有設(shè)置max_input_time的話(huà)(即值等于-1),在php_request_startup()階段也會(huì)設(shè)置一個(gè)定時(shí)器,但超時(shí)時(shí)間被設(shè)為了EG(timeout_seconds),而EG(timeout_seconds)已經(jīng)在php_module_startup()階段被賦值為max_execution_time,所以此時(shí)的超時(shí)時(shí)間就是max_execution_time;在php_execute_script()階段不會(huì)重新設(shè)置定時(shí)器,前一階段設(shè)置的max_execution_time定時(shí)器仍然生效著。那么整個(gè)PHP腳本的最大執(zhí)行時(shí)間就是max_execution_time。
PHP文件中怎么配置超時(shí)時(shí)間

zend_set_time() 使用setitimer(ITIMER_PROF, &t_r, NULL); 來(lái)實(shí)現(xiàn)定時(shí)器,ITIMER_PROF會(huì)統(tǒng)計(jì)包括用戶(hù)態(tài)和內(nèi)核態(tài)下所花費(fèi)的時(shí)間,而像sleep()這樣的系統(tǒng)調(diào)用會(huì)讓進(jìn)程掛起,不占用cpu時(shí)間片,所以這倆超時(shí)時(shí)間是不包括sleep()時(shí)間的。

當(dāng)定時(shí)器到時(shí)間后,ZendVM會(huì)拋出E_ERROR,即Fatal error錯(cuò)誤。

四、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是留給子進(jìn)程處理來(lái)自master進(jìn)程信號(hào)的時(shí)間限制。

分析

當(dāng)master進(jìn)程接收到SIGINT、SIGTERMSIGQUIT、SIGUSR2這些信號(hào)時(shí),會(huì)調(diào)用fpm_pctl()來(lái)進(jìn)行處理。

首先master進(jìn)程會(huì)根據(jù) 接收到的信號(hào) 和 當(dāng)前fpm的運(yùn)行狀態(tài) 來(lái)決定發(fā)送給worker進(jìn)程的是SIGQUIT還是SIGTERM信號(hào),同時(shí)注冊(cè)時(shí)間為process_control_timeout的定時(shí)事件。

如果在process_control_timeout時(shí)間內(nèi)子進(jìn)程沒(méi)有退出,那么master進(jìn)程會(huì)升級(jí)SIGQUITSIGTERM,SIGTERMSIGKILL,并注冊(cè)1s的定時(shí)事件。SIGKILL就直接終止worker進(jìn)程了,SIGTERM還能再給worker進(jìn)程1s的時(shí)間。

綜上,process_control_timeout可以理解為master進(jìn)程留給worker進(jìn)程結(jié)束自己的時(shí)間,要是到時(shí)間worker還沒(méi)搞定那就開(kāi)始master自己的策略了。

五、request_terminate_timeout、request_slowlog_timeout

因?yàn)?code>request_terminate_timeout 和 request_slowlog_timeout 聯(lián)系比較密切,所以放在一起來(lái)講。

php-fpm.conf 解釋
request_terminate_timeout

; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0

翻譯:執(zhí)行一個(gè)請(qǐng)求的超時(shí)時(shí)間,在這之后worker進(jìn)程將被終止。這個(gè)選項(xiàng)應(yīng)該被用在max_execution_time 這個(gè)ini選項(xiàng)由于某些原因不能停止腳本執(zhí)行的時(shí)候。

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

翻譯:執(zhí)行一個(gè)請(qǐng)求的超時(shí)時(shí)間,在這之后一個(gè)PHP的backtrace會(huì)被輸出到slowlog文件里。

分析

request_slowlog_timeoutrequest_terminate_timeout 用在master進(jìn)程的心跳檢測(cè)中(fpm_pctl_heartbeat()),心跳時(shí)間heartbeat 簡(jiǎn)化后的算法是

  • 在開(kāi)啟request_terminate_timeout情況下:request_terminate_timeout/1000*3

  • 在未開(kāi)啟request_terminate_timeout情況下:request_slowlog_timeout/1000*3 或者 0

  • request_terminate_timeout >= request_slowlog_timeout

第三條規(guī)則是為了保證slowlog不影響到正常的請(qǐng)求,heartbeat 取超時(shí)時(shí)間的1/3應(yīng)該是為了避免心跳檢測(cè)過(guò)于頻繁,因?yàn)槊看涡奶鴻z測(cè)都需要遍歷所有worker進(jìn)程。

如果超時(shí)事件發(fā)生了,那么將直接kill掉worker進(jìn)程,kill(child_pid, SIGTERM); ,之后內(nèi)核回收資源關(guān)閉client_socket,nginx返回502錯(cuò)誤給瀏覽器。

以上就是“PHP文件中怎么配置超時(shí)時(shí)間”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞名稱(chēng):PHP文件中怎么配置超時(shí)時(shí)間
網(wǎng)頁(yè)路徑:http://weahome.cn/article/pccoei.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部