Php
PHP slowlog 為空,即使 PHP-FPM 說它正在記錄
我在 Unix 域套接字上偵聽 PHP-FPM,並且我已經
www
使用以下值配置了池(唯一存在的):slowlog = /$pool.log.slow request_slowlog_timeout = 10s
只是為了測試,我將 max_execution_time 設置
php.ini
為 20 秒。然後我創建了一個測試腳本:<?php while(1){ $i++; } ?>
然後通過網路瀏覽器訪問它。該腳本最終超時,
max_execution_time
但日誌仍然為空:root@b7e4a919c988:/var/www/html# ll /www.log.slow -rw-rw-rw-. 1 www-data root 0 Jan 4 21:31 /www.log.slow
PHP-FPM 日誌,但似乎表明它希望記錄慢速執行:
[04-Jan-2018 21:37:28] WARNING: [pool www] child 9382, script '/var/www/html/test.php' (request: "GET /test.php") executing too slow (13.061999 sec), logging
我嘗試了各種方法,例如使用循環
sleep(10000)
或將while
循環放入函式中(以防它無法建構堆棧跟踪),但似乎沒有任何東西可以讓它將回溯列印到日誌中。日誌文件本身的存在似乎也表明 FPM 期望寫入慢速請求。在這一點上,我只是不知道還要檢查什麼。
因此,經過大量待辦事項,我終於找到了問題所在。問題是在 Linux 上,PHP-FPM 用於
SYS_PTRACE
跟踪工作程序(我猜這就是它檢索跟踪數據的方式),但docker
容器預設情況下不允許此功能。一旦我使用該選項執行 docker 容器並配置了 OP(和)中提到
--cap-add=SYS_PTRACE
的兩個設置。www.conf``slowlog``request_slowlog_timeout
與我看到的其他 SO 答案相反,我從來不需要啟用
catch_workers_output
它來使其工作。上面的腳本生成這個輸出到慢日誌:
[09-Jan-2018 17:30:39] [pool www] pid 9382 script_filename = /var/www/html/work.php
但是為了生成更真實的函式跟踪,我寫了這個小數字:
<?php function callsSlowFunc(){ for ($i=0; $i<=10; $i++){ slowFunc(); } } function slowFunc(){ for ($j=0; $j <= 50000000; $j++){ $hey="there"; } } callsSlowFunc();
這導致生成此函式跟踪:
[09-Jan-2018 17:40:49] [pool www] pid 9382 script_filename = /var/www/html/work.php [0x00007fee53613150] slowFunc() /var/www/html/work.php:6 [0x00007fee536130a0] callsSlowFunc() /var/www/html/work.php:19