看來,我的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被拾起請求。
我知道這可能有很多錯誤,但我不想在這裏脫離主題。有沒有辦法壓制標題?
正如你所看到的,當一個PHP腳本處於請求的中間時,這是個壞主意。如果你使用Apache和mod_php,fork實際上也會分支Apache。這無疑不是你想要的。你能告訴我們更多關於長期運行的過程在做什麼嗎?有很多更好的方法來處理長時間運行的後臺任務,但爲了向您推薦一個後臺任務,我們需要了解更多信息。 – Charles 2011-04-12 23:45:27
您是否找到解決方案? – zeflex 2015-01-04 01:21:13