PHP使用pcntl_fork()分析php-fpm

时间:2010-02-20 02:42:48

标签: php fork

我正在使用此代码:

echo "1. posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";

$pid = pcntl_fork();
var_dump($pid);
if ($pid == -1) die("could not fork");

if ($pid) {
//parent
echo "2. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";
} else {
//child
$sid = posix_setsid();

if ($sid < 0)
exit;

echo "3. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";

$fp = fopen("/tmp/testfile", "w");
fwrite($fp, '$data');
fclose($fp);

} 

出于某种原因,有时会将else块发送到浏览器,有时会显示if($ pid)块。

我想要实现的是发送一些响应,然后在与客户端的连接关闭后继续处理。然后在后请求处理完成后最终关闭。如果我睡在孩子或父母那里请求挂起。

虽然这两个部分都在执行,但确定将哪个部分发送到浏览器只是很奇怪。

提前致谢。

2 个答案:

答案 0 :(得分:2)

实际上您应该使用fastcgi_finish_request()将响应发送到浏览器,然后继续在后台运行。但请记住,这仅在使用PHP-FPM时有效。

注意:PHP手册中没有记录fastcgi_finish_request()函数(参见错误61449),但使用非常简单。

对于ignore_user_abort(),php.net上的一些评论建议使用Content-Length: 0标题,但这会在将SSL与Internet Explorer结合使用时导致问题。

答案 1 :(得分:0)

请考虑使用ignore_user_abort()