当我在pcntl_fork()时如何阻止php返回标题?

时间:2011-04-12 23:33:15

标签: php header fork shared-memory

似乎我的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()我能够将额外标头对的数量保持为2。那么呃..在哪里缓冲输出?

当然,我对使用不涉及输出缓冲的解决方案感到满意。

感谢您的帮助!

编辑: 这个特定的玩具分支用于模拟将请求传递给模型,使用视图读取其输出数据流,然后通过模板引擎将其转换为由定期ajax请求获取。

我知道这可能有很多问题,但我不想在这里偏离主题。有没有办法抑制标题?

1 个答案:

答案 0 :(得分:0)

我很确定apache正在添加这些标头,而不是php。这就是输出缓冲不起作用的原因。你必须在apache中关闭那些。