nginx日志php-fpm的stderr输出在看似随机的位置被切断

自从我开始使用一个产生一个长的调用链的PHP库之后,debugging它的问题就变得越来越困难了,因为我的错误日志最终包含这样的输出结果:( 一些值已经被*清空了)

 2017/08/23 10:47:26 [error] 13057#13057: *206119 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught ActiveRecord\DatabaseException: PDOException: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: "" in /var/www/********/vendor/php-activerecord/php-activerecord/lib/Connection.php:337 Stack trace: #0 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Connection.php(337): PDOStatement->execute(Array) #1 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Table.php(237): ActiveRecord\Connection->query('SELECT * FROM "...', Array) #2 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Table.php(219): ActiveRecord\Table->find_by_sql('SELECT * FROM "...', Array, false, NULL) #3 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Model.php(1666): ActiveRecord\Table->find(Array) #4 /var/www/********/vendor/php-activerecord/php-activerecord/lib/Model.php(1605): ActiveRecord\Model::find_by_pk('', Array) #5 /var/www/********/includes/classes/Models/NSModel.php(11): ActiveRecord\Model::find(''" while reading response header from upstream, client: **.***.***.***, server: ***********, request: "POST /************************************ HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.1-fpm.sock:", host: "***********", referrer: "************************************************************" 

注意FastCGI stderr输出在最后一行如何在ActiveRecord\Model::find(''"之后突然结束。

 2017/08/22 17:20:53 [error] 13057#13057: *193907 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught TypeError: Argument 1 passed to App\DeviantArt::isImageAvailable() must be of the type string, null given, called in /var/www/********/includes/classes/ImageProvider.php on line 138 and defined in /var/www/********/includes/classes/DeviantArt.php:357 Stack trace: #0 /var/www/********/includes/classes/ImageProvider.php(138): App\DeviantArt::isImageAvailable(NULL) #1 /var/www/********/includes/classes/ImageProvider.php(21): App\ImageProvider->setUrls('*******') #2 /var/www/********/includes/classes/Posts.php(207): App\ImageProvider->__construct('******************', Array) #3 /var/www/********/includes/classes/Controllers/PostController.php(334): App\Posts::checkRequestFinishingImage('***************...') #4 /var/www/********/includes/classes/RouteHelper.php(11): App\Controllers\PostController->action(Array) #5 /var/www/********/includes/do.php(27): App\RouteHelper::App\{closure}(Array) #6 /var/www/********/www/index.php(1): require('/var/www/******...') #7 {main} t" while reading response header from upstream, client: **.***.***.***, server: ***********, request: "POST /*************************** HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.1-fpm.sock:", host: "***********" 

这里stderr输出在t之后被截断,这留下了足够的信息来find问题,但是它仍然不是完整的消息。 在输出长度和中断时间之间我找不到任何模式。

我在Debian Stretch上使用nginx版本1.10.3和PHP版本7.1.8。 我也尝试在nginx.conf设置下面的值(因为我在以前查找过这个问题的解决scheme),但是上面的例子是在这些设置已经生效的情况下生成的。

 fastcgi_buffers 256 4k; client_max_body_size 20M; 

根据类似的问题find的答案,即使我不知道如何解决php-fpm的字符限制,nginx也会截断输出,可能导致信息的丢失。

为了完全消除这个风险,我select使用Monolog来处理应用程序级别的日志logging,可以使用文件输出来任意长的错误消息和堆栈跟踪。 这个问题可能对任何想要这样做的人有帮助。