我正在使用此代码:
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)块。
我想要实现的是发送一些响应,然后在与客户端的连接关闭后继续处理。然后在后请求处理完成后最终关闭。如果我睡在孩子或父母那里请求挂起。
虽然这两个部分都在执行,但确定将哪个部分发送到浏览器只是很奇怪。
提前致谢。
答案 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()
。