【发布时间】:2011-04-12 23:33:15
【问题描述】:
似乎我的 php 为 pcntl_fork() 生成的每个孩子打印 X-Powered-By 和 Content-Type 标头。如果它不在输出中间打印它们,这不会是一个问题。
例如,这个玩具脚本:
function very_long_process($shm){
sleep(20);
shm_put_var($shm,0,'terminated');
}
function iterate_until_terminated($shm){
$signal = shm_get_var($shm,0);
if($signal=='running'){
$j = shm_get_var($shm,1);
$j++;
shm_put_var($shm,1,$j);
sleep(2);
iterate_until_terminated($shm);
}
else{
exit;
}
}
$shm = shm_attach(ftok(tempnam('/tmp','PHP'),'a'),1000000);
shm_put_var($shm,0,'running');
$i=0;
shm_put_var($shm,1,$i);
$pid = pcntl_fork();
if($pid==0){
iterate_until_terminated($shm);
}
very_long_process($shm);
while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
}
$iterated = shm_get_var($shm,1);
$signal = shm_get_var($shm,0);
echo "<p>iterated $iterated times.";
echo "<p>process was $signal";
产生输出(在浏览器中):
X-Powered-By: PHP/5.2.17
Content-type: text/html
<p>iterated 10 times.<p>process was terminated
我已经阅读并愿意相信,解决方案是使用 ob_start() 和 ob_end_clean(),但我已经在几个地方尝试过,但它不起作用,尽管(奇怪地) ob_end_flush() 我能够将额外标头对的数量保持为两个。那么呃..在哪里缓冲输出?
当然,我对不涉及输出缓冲的解决方案同样满意。
感谢您的帮助!
编辑: 这个特殊的 toy 分支旨在模拟将请求传递给模型,使用视图读取其输出数据流,然后通过模板引擎将其转换为由周期性 ajax 请求获取。
我知道这可能有很多问题,但我不想在这里跑题。有没有办法抑制标题?
【问题讨论】:
-
如您所知,当 PHP 脚本在处理请求时分叉它是一个坏主意。如果您使用的是 Apache 和 mod_php,那么 fork 实际上也分叉了 Apache。这无疑不是你想要的。你能告诉我们更多关于长期运行的过程在做什么吗?有很多更好的方法来处理长时间运行的后台任务,但我们需要了解更多才能向您推荐一种。
-
您找到解决方案了吗?
标签: php header fork shared-memory