這篇文章帶大家聊聊PHP設定文件,解析一下設定檔(php.ini 和 php-fpm.conf)中的幾個超時相關的配置,希望能夠給大家提供幫助!
一、摘要
php.ini 和 php-fpm.conf 中有很多逾時相關的配置,那麼這些配置到底有什麼作用呢?在原始碼中又是怎麼實現的呢?這篇文章就來講講下面幾種逾時配置:
php.ini
- #max_execution_time
- max_input_time
php- fpm.conf
- process_control_timeout
- #process_control_timeout
#process_control_timeout
#process_control_timeoutrequest_terminate_timeoutrequest_slowlog_timeout
Mac 10.14.2 PHP 7.3.7二、設定解析規則
解析規則
#php.ini的解析是在
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)
#參數解釋
name:
設定名稱# default_value: 設定預設值
##modifiable:設定的可被設定範圍
#########PHP_INI_PERDIR## #######可在php.ini,.htaccess 或httpd.conf 中設定###############PHP_INI_SYSTEM#########可在php .ini 或httpd.conf 中設定###############PHP_INI_ALL#########可在任何地方設定########## ##,因而不能用 ini_set() 來設定。但 display_errors 指令是屬於 PHP_INI_ALL 因而就可以在任何地方被設定,包括 ini_set()。 這些模式決定著一個PHP 的指令在何時何土地,是否能夠被設定。手冊中的每個指令都有其所屬的模式。例如有些指令可以在 PHP 腳本中用 ini_set() 來設定,而有些則只能在 php.ini 或 httpd.conf 中。 例如 output_buffering 指令是屬於 PHP_INI_PERDIR模式 意義 PHP_INI_USER ##可在使用者腳本(例如ini_set())或Windows 註冊表(自PHP 5.3 起)以及.user.ini 中設定
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)
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; }
设置超时定时器
// 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); } ...... }
从上面代码可以看到,如果设置了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 解釋
分析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#翻譯:執行一個請求的超時時間,在這之後worker進程將被終止。這個選項應該被用在
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' .
翻譯:執行一個請求的超時時間,在這之後一個PHP的backtrace會被輸出到slowlog檔案裡。
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
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
heartbeat 取超時時間的1 /3應該是為了避免心跳偵測太頻繁,因為每次心跳偵測都需要遍歷所有worker進程。
kill(child_pid, SIGTERM); ,之後內核回收資源關閉client_socket,nginx返回502錯誤給瀏覽器。
PHP影片教學》
以上是淺析PHP配置檔案中的幾種逾時配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

會話ID應在登錄時、敏感操作前和每30分鐘定期重新生成。 1.登錄時重新生成會話ID可防會話固定攻擊。 2.敏感操作前重新生成提高安全性。 3.定期重新生成降低長期利用風險,但需權衡用戶體驗。

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),