2011-04-12 86 views
1

看來,我的PHP打印由pcntl_fork()所做的每個孩子的X-Powered-By和Content-Type標題。如果它不在輸出中間打印它們,這不會成爲問題。當我pcntl_fork()時,如何停止返回標頭的php?

所以,舉例來說,這個玩具腳本:

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()我能夠保持額外的標題對的數量爲兩個。所以呃..緩衝輸出的地方在哪裏?

當然,我會對不涉及輸出緩衝的解決方案感到滿意。

感謝您的幫助!

編輯: 這種特殊玩具叉指以模擬傳遞請求到模型,以期讀取的數據的它的輸出流,然後平移經由模板引擎由週期性AJAX被拾起請求。

我知道這可能有很多錯誤,但我不想在這裏脫離主題。有沒有辦法壓制標題?

+1

正如你所看到的,當一個PHP腳本處於請求的中間時,這是個壞主意。如果你使用Apache和mod_php,fork實際上也會分支Apache。這無疑不是你想要的。你能告訴我們更多關於長期運行的過程在做什麼嗎?有很多更好的方法來處理長時間運行的後臺任務,但爲了向您推薦一個後臺任務,我們需要了解更多信息。 – Charles 2011-04-12 23:45:27

+0

您是否找到解決方案? – zeflex 2015-01-04 01:21:13

回答

0

我很確定apache是​​添加這些頭,而不是php。這就是爲什麼輸出緩衝不起作用。你必須讓這些關閉在Apache中。

+0

'X-Powered-By:PHP ...'只能從PHP本身發出。 Apache不會在沒有被PHP告知的情況下發送這些頭文件。 – Charles 2011-04-12 23:54:49

+0

啊,是的,好點 – profitphp 2011-04-14 22:24:07