2011-09-27 99 views
2

所以我試圖Show results while script is still executing如何顯示結果,而PHP腳本仍在運行

,但由於某種原因,它不工作,所以這裏是我到目前爲止有:

ob_start(); 
include "../../common.php"; 

set_time_limit (0); 

$start = (string) $_GET['start']; 
$end = (string) $_GET['end']; 

for($i = $start; strcmp($i, $end); $i = bcadd($i, 1)){ 

echo $i; 
ob_flush(); 

} 

ob_end_flush(); 

更新的代碼

*請注意,此代碼還沒有工作!

set_time_limit(0); 

$start = $_GET['start']; 
$end = $_GET['end']; 

for(;$start < $end;$start++){ 
$content = file_get_contents("[some internal page]"); 
echo $content; 
usleep(10); 
flush(); 
} 

回答

2

嘗試在ob_flush()的電話後添加致電flush()。這隻有在您的服務器配置爲可以執行此操作時纔有效,並且不能保證客戶端能夠合理處理它,但這是您的最佳選擇。

我在這裏遇到的一個問題是你有zlib.output_compression配置你絕對不能做到這一點,句號。 zlib輸出壓縮過程在執行任何代碼之前啓動,並且在運行時無法通過腳本在ini_set()等等的控制下進行控制。

+0

我試過了你說的,但它不工作...這裏是我的php.ini設置,可能是這樣的:http://s135001.gridserver.com/gs-bin/phpinfo.php5 ??? – ahoura

+0

嘿你的腳本工作,但是當我用我自己的一段代碼它停止工作! S:無論如何,我可以私下和你談談嗎? – ahoura

+0

@ahoura我即將上牀睡覺(這裏是晚上11點),但我會在大約11個小時後回來,所以如果你願意,我會聊天。我的猜測是,你的問題是你沒有發送足夠的內容到瀏覽器來開始渲染。 – DaveRandom

1

您通常需要通話雙方flush()ob_flush()。請參閱:http://php.net/manual/en/function.flush.php

此外,您無法對客戶端瀏覽器的緩衝區執行任何操作。瀏覽器會根據需要緩存數據。某些服務器可能也不支持刷新其緩衝區。

+0

我試過你說的,但它不工作...這裏是我的php.ini設置,可能是這樣的:http://s135001.gridserver.com/gs-bin/phpinfo.php5 ??? – ahoura

+1

沒有我能看到那會導致它,但然後我不知道一切...嘗試一個腳本與它在這個:'<?php set_time_limit(0); for($ i = 1; $ i <1000; $ i ++){echo「This is iteration $ i
」; usleep(10000); flush();}'對於我在IE8中,大約需要2-3秒才能呈現任何內容。 – DaveRandom

+0

@ahoura,在您的服務器上發佈指向測試腳本的鏈接。 – Brad

1

後使用ob_flush();添加flush();這實際上會刷新寫入緩衝區和輸出緩衝區。將ob_flush刷新到寫入緩衝區中,flush()然後將其推送到客戶端。通常至少。

+0

我試過你說的,但它不工作...這裏是我的PHP。ini設置,可能是這樣的:http://s135001.gridserver.com/gs-bin/phpinfo.php5 ??? – ahoura