2012-08-05 61 views
8

我試圖熟悉PHP的flush()函數,我正在做一個項目,我自己寫了幾個腳本,並將它們上傳到我自己的一些webspace;但似乎沒有一個人工作。我從PHP.net評論拿起一個下方,試了一下:PHP flush()顯然適用於我的Linux機器,但不適用於我的Windows機器?

<?php 
header('Content-type: text/html; charset=utf-8'); 

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

顯然,腳本仍然不能正常工作。

然後我讀的評價是說:

如果你調用使用ob_flush()和flush()和仍然沒有得到緩衝液沖洗這可能是因爲一些殺毒軟件(Panda在這種情況下)持有直到頁面完成加載,然後將其發送到瀏覽器。

因此,我決定請求在我使用Linux(Ubuntu 12.04)的計算機上的網頁,因爲它沒有安裝任何防病毒軟件;它完美的工作!

我不知道這是否與防病毒軟件有關?或者在Windows中阻止flush()達到預期目的的其他一些奇怪機制,我在兩臺機器上都使用相同的瀏覽器(Firefox 14.0.1),所以我懷疑它可能是這樣。所以我想我真正的問題是:有沒有人知道反病毒軟件防止flush()實現其預期目的(因爲我似乎無法找到任何關於它的在線)?如果是這樣,有什麼方法可以解決它嗎?

編輯:只是爲了清理,我肯定這不是服務器端,我有一個運行Linux的外部Web服務器,我不是在Linux或Windows機器上本地託管這些腳本。編輯2:我在Linux筆記本電腦上的一個朋友家中嘗試過這種方法,我設法讓它在我的房子裏工作,奇怪的是,同花順的代碼也沒有在他們家工作(相反,它只花了很長時間來加載和所有這一切都出來了)這是奇怪的,因爲它在我家裏的這檯筆記本電腦上工作,我不確定路由器是否與flush()函數有關(我真的無法在網絡上找到任何有關),因爲那是我能想到的唯一可能會干擾它的事情。

否則我沒有取得任何進展,試圖獨自解決這個問題,這絕對與服務器端無關,這很奇怪,因爲我似乎發現大多數信息都是關於服務器是問題的時候flush()函數不起作用:/

巧合的是,我也試過在運行諾頓(而不是AVG)的PC上運行它,但它的工作原理並不完全是100%。

回答

4

有幾件事情,可以防止立即顯示輸出,其中包括:

  • 緩衝在PHP(這是什麼flush防止)
  • 緩衝,以積累足夠的數據壓縮(當啓用壓縮)
  • 緩衝在Web服務器上(它可以決定無論何種原因)
  • 緩衝瀏覽器(瀏覽器使用的各種技術,使頁面加載「感覺快」裏面到底這樣做用戶;這些技術包括並不總是隻要它可顯示內容)

由於flush這個名單上無法控制一切,實在是沒有保證,你期望它你的程序的行爲。

所有這一切都在說明中提到的flush

刷新PHP程序的寫緩衝器,無論後端PHP使用(CGI,web服務器等)。這會嘗試通過幾個注意事項來將當前輸出全部推向瀏覽器。

flush()可能無法覆蓋您的Web服務器的緩衝方案,並且它對 瀏覽器中的任何客戶端緩衝都沒有影響。它也不影響PHP的用戶空間輸出緩衝 機制。這意味着如果您正在使用這些緩衝區,則必須調用ob_flush()和flush()以刷新ob輸出緩衝區。

幾臺服務器,特別是Win32上的服務器,仍然會緩存腳本的輸出,直到在將結果 發送給瀏覽器之前終止。

Apache的服務器模塊(如mod_gzip)可能會執行自己的緩衝操作,這會導致flush()不會導致數據立即發送到客戶端 。

即使瀏覽器可能會在顯示它之前緩衝其輸入。例如,Netscape會緩存文本,直到它接收到行尾 或標籤的開頭,並且直到看到最外面的表格的 標籤纔會呈現表格。

的Microsoft Internet Explorer的某些版本纔開始,他們已經收到256個字節後顯示的頁面,所以你 可能需要衝洗讓那些 瀏覽器顯示頁面之前發送額外的空格。

+0

我知道這絕對是客戶端,而不是服務器端,雖然在Linux中的Firefox中呈現相同的頁面,但在Windows下不好。這導致我認爲這也不是瀏覽器相關的問題。 。 。這似乎消除了該報價中的所有解釋:/ – Sean 2012-08-05 13:41:39

+0

@SeanDunwoody:你怎麼知道它不是服務器端?服務器是每個操作系統下的不同程序。瀏覽器也一樣。 – Jon 2012-08-05 13:45:04

+0

不,對不起,我認爲你誤解了,我有一臺服務器託管這個正在運行的Linux,我不在任何一臺機器上本地託管這個 – Sean 2012-08-05 13:46:00

相關問題