2015-01-08 66 views
0

我有一個腳本,曾經在PHP5.3中處理特定日誌文件的緩衝,但在服務器升級到PHP5.5後,它不再有效。輸出需要html,所以我希望在每個回聲之後刷新輸出。PHP流媒體/輸出緩衝不再工作

這是用來工作的代碼的刪節測試版...

@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('implicit_flush', 1); 
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); } 
ob_implicit_flush(1); 

set_time_limit(0); 

echo 'Start ...<br />'; 
for($i = 0 ; $i < 10 ; $i++) 
{ 
    echo $i . '<br />'; 
    flush(); 
    ob_flush(); 
    sleep(1); 
} 
echo 'End<br />'; 

我懷疑@ini_set命令不被壓倒一切的設置,我只是希望有一個簡單的例子,將刷新輸出緩衝區。網上的大多數例子都來自6年以前,他們都沒有工作過。我讀到緩衝是用PHP5.4重寫的,所以我不知道這是否也是怪罪。

+0

您是否考慮到某些瀏覽器在發送任何內容之前需要至少看到1024個字節的輸出?是否沖洗? – dgig

回答

0

我已經測試你的腳本,並做了一些固定/增強

@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0); 

// you can dismiss this configuration, the bellow explanation is from the php.ini itself 
/* Implicit flush tells PHP to tell the output layer to flush itself 
    automatically after every output block. This is equivalent to calling the 
    PHP function flush() after each and every call to print() or echo() and each 
    and every HTML block. 
*/ 
@ini_set('implicit_flush', 1); 
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); } 
ob_implicit_flush(1); 

set_time_limit(0); 

echo 'Start ...<br />'; 
for($i = 0 ; $i < 10 ; $i++) 
{ 
    // put the bellow php code if the user browser is Firefox, Internet Explorer or Safari 
    // Google Chrome just works fine with it but it do not need 
    echo str_repeat(" ", 1024); 

    echo $i . '<br />'; 
    flush(); 
    // ob_flush(); you have used flush(), why using ob_flush() there is nothing to flush anymore 
    sleep(1); 
} 
echo 'End<br />'; 

我不認爲PHP的版本更新導致的問題,但我不能肯定
希望幫助:)

+0

嗯。在FireFox或Chrome中仍然不適用於我。我曾經在某處讀過@ini-set可能實際上並不工作,所以我可能需要在.htaccess文件中設置它們。感謝您的迴應和出色的評論。 :) – Das123