PHP-FPM fastcgi_finish_request可靠吗?

时间:2013-01-07 07:55:41

标签: php fastcgi

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

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

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

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

4 个答案:

答案 0 :(得分:3)

哇,我也受到了这个打击。到目前为止,行为似乎是这样的: 在调用fastcgi_finish_request()之后,函数内的任何echo语句就像是一个return语句,停止执行该函数。

我会对它进行更多测试,然后将错误提交给bugs.php.net,也许吧。

<强>更新

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

我将创建一个PHP bug票据以防万一。

重现的代码:     

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);

https://bugs.php.net/bug.php?id=68772

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

要获取错误日志工作集,请执行以下操作: catch_workers_output = yes 在您的池配置文件中 www.conf

sed -i "s/;catch_workers_output = yes.*/catch_workers_output = yes/g" /etc/php/<VERSION>/fpm/pool.d/www.conf