◆ cli は出力はコンソールに出るけど FPM だと stdout と stderr は出ない
◆ catch_workers_output を yes に設定するとエラーログに出力される
◆ fedora では設定変えると php-fpm を再起動必要
  ◆ httpd/nginx の再起動じゃ更新されてない

環境

環境は Apache の FPM です
fedora 29 のデフォルトのやつです

PHP / FPM バージョンは 7.2.16 です

<?php
echo PHP_SAPI;

> curl http://localhost/sapi.php
fpm-fcgi

ログの場所

Apache

> apachectl -S 2>/dev/null | grep -i log
Main ErrorLog: "/etc/httpd/logs/error_log"

/etc/httpd/logs/error_log

PHP cli

> php -r "phpinfo();" | grep  error_log
error_log => no value => no value
opcache.error_log => no value => no value

no value なので未設定

PHP FPM

<?php
phpinfo();

> curl http://localhost/info.php | grep error_log

<tr><td class="e">error_log</td><td class="v">/var/log/php-fpm/www-error.log</td><td class="v">/var/log/php-fpm/www-error.log</td></tr>
<tr><td class="e">opcache.error_log</td><td class="v"><i>no value</i></td><td class="v"><i>no value</i></td></tr>

/var/log/php-fpm/www-error.log

出力する

<?php

echo "phpoutput";
file_put_contents("php://stdout", "phpstdout");
file_put_contents("php://stderr", "phpstderr");

cli だと

> php /var/www/html/a.php
phpoutputphpstdoutphpstderr

全部表示されます

FPM だと

> curl http://localhost/a.php
phpoutput

phpoutput だけです
phpstdout と phpstderr はありません

ログファイルを見てみると

/etc/httpd/logs/error_log
/var/log/php-fpm/www-error.log

どっちも更新なしです

Apache が捨ててるのかな

httpd -DFOREGROUND

で動かしたら表示されたりする?
と思って試してみましたが出ません

出力どこいったんだろう

nginx にしてみる

Apache が悪いの?
なら nginx だと出力されるかも と思ったので試してみます

ログファイルは一緒です

/var/log/php-fpm/www-error.log

> curl http://localhost:9000/a.php
phpoutput

一緒でした

catch_workers_output

設定ファイルに何かないか探しているとこういうのがありました

; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Note: on highloaded environement, this can cause some delay in the page
; process time (several ms).
; Default Value: no
;catch_workers_output = yes

worker の stdout と stderr をメインのエラーログにリダイレクトさせる機能のようです
なんとこれをセットしてないと stdout と stderr は /dev/null にリダイレクトされて捨てられてるようです
これが FastCGI の仕様らしいです

負荷が高くてページの処理時間に数 ms の遅延が出るらしくてデフォルトが no です
数 ms くらい別にいいので yes にしてみました

httpd/nginx も再起動



……ない!

なんどか再起動して何度もアクセスしたのに全然ログが更新されないです

php-fpm

別の原因なのかなと設定ファイル等色々探していると php-fpm というサービスが存在するのを見つけました
php-fpm って httpd や nginx じゃなくて独立したサービスなの?
とりあえずすごくこれっぽいので再起動してみると

/var/log/php-fpm/error.log



[15-Apr-2019 12:11:10] WARNING: [pool www] child 16606 said into stdout: "phpstdout"
[15-Apr-2019 12:11:10] WARNING: [pool www] child 16606 said into stderr: "phpstderr"

ちゃんと出ていました

全部 echo

一応出力は見えるようになったものの いろいろ面倒です
もともと cli 用ツールだったので stdout/stderr は普通に使ってましたが ウェブサーバとして使うときに不便なのでとりあえず全部 echo で出力しておいたほうがいい気がしました
あとは exec とかサブプロセス実行もそのまま stdout/stderr に流れそうなので PHP 側でキャプチャして echo だったりログファイル書き込みとかするようにしたほうがいいかもです
proc_open とか使えばできるのかな?