6

在声明后在我的 php 脚本中实施一些后处理后fastcgi_finish_request();,我担心会出现一些差异。

看起来 PHP 在 fastcgi_finish_request 之后没有执行所有脚本。

在日志文件中,我找不到关于这部分的通知,没有警告,没有错误或违规行为。

是否存在文档中未提及的使用 fastcgi_finish_request 的限制或提示?

4

4 回答 4

6

调用 fastcgi_finish_request() 之后的任何显式或隐式输出刷新都将导致退出 PHP 脚本而没有任何警告或错误。换句话说,在调用 fastcgi_finish_request() 之后调用 flush() 将表现得像调用了 exit() 而不是 flush()。

这是记录该行为的 PHP 票证。他们将其标记为“不是错误”。

这是一些重现该问题的代码:

function writestamp($case, $file){
  file_put_contents($file, "". $case . ": " . time() . "" . PHP_EOL, FILE_APPEND);
}

// Flush buffers and stop output buffering
while (@ob_end_flush());

// Destroy session, otherwise request can't be finished
if(session_status() > 1) session_destroy();

$file = tempnam(sys_get_temp_dir(), 'flushbug_');
echo 'Writing 4 timestamps to: '.$file;

// this one gets called
writestamp('1', $file);

// and this
register_shutdown_function('writestamp', '4', $file);

// finish the request
fastcgi_finish_request();

// as does this
writestamp('2', $file);

// but this one does NOT - calling flush() after fastcgi_finish_request() exits PHP without errors or warnings
flush();
writestamp('3', $file);

一个简单的解决方法是在调用ignore_user_abort(true)之前或之后fastcgi_finish_request调用:

ignore_user_abort(true);
fastcgi_finish_request();
于 2015-01-08T19:18:32.213 回答
2

到目前为止,对我们来说,在调用 fastcgi_finish_request() 之后,几乎所有东西都可以正常工作。除了 error_log()。调用此函数后它不会记录任何内容。

于 2014-01-24T23:40:17.457 回答
1

要获取错误日志工作集:catch_workers_output = yes在您的池 conf 文件www.conf

sed -i "s/;catch_workers_output = yes.*/catch_workers_output = yes/g" /etc/php/<VERSION>/fpm/pool.d/www.conf
于 2018-10-22T14:54:56.127 回答
0

error_log默认情况下,通过 fastcgi 写入日志(这就是你看到 php log into的原因/var/log/nginx/error.log),当调用时fastcgi_finish_request,这将关闭 php-fpm 和 fastcgi 服务器(实例为 Nginx)之间的链接,因此日志不会写入:/

您可以根据http://php.net/manual/fr/function.error-log.php上的文档指定日志位置。

注意 php worker 还活着,并且可以使 php-fpm 池饱和。

于 2017-11-06T14:30:45.007 回答