Назад | Перейти на главную страницу

PHP slowlog пуст, хотя PHP-FPM сообщает, что ведется журнал

У меня есть PHP-FPM, прослушивающий сокет домена Unix, и я настроил 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 по умолчанию контейнеры не позволяют использовать эту возможность.

Как только я запустил контейнер докеров с --cap-add=SYS_PTRACE вариант и настроил два www.conf настройки, упомянутые в ОП (slowlog и request_slowlog_timeout).

В отличие от других ответов SO, которые я видел опубликованными, мне никогда не приходилось включать catch_workers_output чтобы заставить его работать.

Приведенный выше сценарий генерирует этот вывод в slowlog:

[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