Php

PHP slowlog 為空,即使 PHP-FPM 說它正在記錄

  • January 9, 2018

我在 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

引用自:https://serverfault.com/questions/890768