記一次debug -- php的session_start timeout

今天回到公司,打開電腦,循例摸完魚(劃掉)以後準備開始工做,打開Chrome,打開本地後臺,等了很久以後,給我報了time out image.pngphp

???PHP掛掉了?先去看下PHP進程在不在mysql

image.png 進程還在?是redis或者mysql的超時嗎? 用Navicat連了一下mysql,能夠連。連了一下本地redis,也沒問題。那是php自己的問題? 看了一下php和php-fpm錯誤日誌,也沒有報錯和異常,在腳本里面斷點也可以打印出來,這就很奇怪了。nginx

俗話說得好,沒有什麼問題是重啓不能解決的,若是有,那就重裝系統(誤)。web

而後我把php和nginx都重啓了一遍,發現仍是超時。不過執行沒出錯,超時的問題我已經能夠定位是php的問題了。而後我想起以前配置php-fpm的時候看到過有個slowlog慢日誌的配置。redis

; The log file for slow requests
; Default Value: not set
; Note: slowlog is mandatory if request_slowlog_timeout is set
slowlog = /usr/local/php/7.1.29/var/log/$pool.log.slow

; 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
request_slowlog_timeout = 10

打開慢日誌,把慢請求的時間設置爲10秒sql

PS:request_slowlog_timeout設置爲0會把慢日誌關閉(dumped to the 'slowlog' file. A value of '0s' means 'off')瀏覽器

而後重啓php-fpm,執行一遍,查看慢日誌yii2

[25-Jun-2019 14:17:38]  [pool caisiming] pid 73482
script_filename = backend/web/index.php
[0x0000000103c197f0] session_start() vendor/yiisoft/yii2/web/Session.php:131
[0x0000000103c19690] open() vendor/yiisoft/yii2/web/Session.php:583
[0x0000000103c195c0] get() vendor/yiisoft/yii2/web/User.php:658
[0x0000000103c191b0] renewAuthStatus() vendor/yiisoft/yii2/web/User.php:188
[0x0000000103c190e0] getIdentity() vendor/yiisoft/yii2/web/User.php:340
[0x0000000103c19070] getIsGuest() common/controllers/Controller.php:31
[0x0000000103c18de0] init() vendor/yiisoft/yii2/base/Object.php:107
[0x0000000103c18d30] __construct() vendor/yiisoft/yii2/base/Controller.php:84
[0x0000000103c18c80] __construct() vendor/yiisoft/yii2/di/Container.php:373
[0x0000000103c18c20] newInstanceArgs() vendor/yiisoft/yii2/di/Container.php:373
[0x0000000103c18940] build() vendor/yiisoft/yii2/di/Container.php:154
[0x0000000103c18600] get() vendor/yiisoft/yii2/BaseYii.php:340
[0x0000000103c18440] createObject() vendor/yiisoft/yii2/base/Module.php:569
[0x0000000103c180f0] createControllerByID() vendor/yiisoft/yii2/base/Module.php:522
[0x0000000103c17d30] createController() vendor/yiisoft/yii2/base/Module.php:514
[0x0000000103c17970] createController() vendor/yiisoft/yii2/base/Module.php:448
[0x0000000103c176f0] runAction() vendor/yiisoft/yii2/web/Application.php:100
[0x0000000103c17390] handleRequest() vendor/yiisoft/yii2/base/Application.php:375

代碼最後執行的是session_start函數,看來是這一步超時了,接下來就好辦了,google一下"session_start超時"。session

獲得的結果都是添加由於session文件鎖住了,後面的請求沒有辦法獲取到session handler,致使了死鎖,從而請求超時。網上的建議是使用session_write_close函數。yii

好,拿到結果立刻幹。可是我加上去以後徹底沒有效果,仍是超時。繼續google往下翻,仍是同樣的結論,看來是彼之蜜糖,吾之砒霜啊。

問題是找到了,可是沒有解決辦法,總得要幹活的吧,沒辦法,只好把session文件刪掉,文件不存在了,鎖也應該不存在了吧。

皮之不存,毛將焉附

網上找到php的session文件在mac的存放位置:

/private/var/tmp/
/var/tmp/
# 兩個目錄是同樣的

刪掉所有session文件,再運行項目,就能夠正常跑了。

結論:網上找的方法沒有用,我我的猜測是有個php子進程掛掉了,或者成了殭屍進程?而後鎖住了session文件,我打開瀏覽器以後session還沒過時,一直請求這個session,因此致使了死鎖。

這樣想的話,那我在瀏覽器端刪掉sessionID應該也能解決這個問題,不過這個辦法並無真正解決問題。

以上。

相關文章
相關標籤/搜索