【问题标题】:How do I stop php from returning headers when I pcntl_fork()?当我 pcntl_fork() 时,如何阻止 php 返回标头?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • X-Powered-By: PHP... 只会从 PHP 本身发出。 Apache 不会在未经 PHP 告知的情况下发送这些标头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2022-01-14
相关资源
最近更新 更多