web-dev-qa-db-ja.com

PHP PHP-FPMがログを記録していると言っていても、slowlogは空です

私はPHP-FPMをUnixドメインソケットでリッスンしていて、wwwプール(存在する唯一のもの)を次の値で構成しました。

_slowlog = /$pool.log.slow
request_slowlog_timeout = 10s
_

テストのために、_php.ini_のmax_execution_timeを20秒に設定しました。次に、テストスクリプトを作成しました。

_<?php

while(1){
  $i++;
}

?>
_

次に、Webブラウザを介してアクセスしました。スクリプトは_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が遅い要求を書き込むことを期待していることを示しているようです。

この時点で、他に何を確認すればよいかわかりません。

2
Bratchley

それで、たくさんのやることの後で、私はついに問題を理解しました。問題は、Linuxでは、PHP-FPMがSYS_PTRACEを使用してワーカープロセスをトレースすることです(これがトレースデータを取得する方法だと思います)が、dockerコンテナーはこの機能を許可しません。デフォルト。

--cap-add=SYS_PTRACEオプションを指定してDockerコンテナーを実行し、OPに記載されている2つのwww.conf設定(slowlogrequest_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
3
Bratchley