2012-07-20 93 views
1

可能重複:從列表發送電子郵件時
what is output buffering?
Why does PHP send it all at once?回聲動態字符串while循環

我想回聲 「發送」 動態。我的腳本完成後纔回聲。如何在while循環中動態地回顯字符串?

$f=fopen("list.txt","r"); 

if($f){ 

    while (!feof($f)) { 

     $line = fgets($f, 4096); 

     $lncount++; 

     $val = $lines[$lncount]; 

     mailsender($line,$yollayan,$sifresi,$name); 

     echo "sent"; 

    } 
} 
+1

@symcbean:讓我們不要有重複的副​​本。 – 2012-07-20 12:53:56

回答

1

試試這個

echo "Sent "; 
    echo str_repeat("\n",1024); 
    flush(); 

從PHP手冊:

的flush()可能無法覆蓋您的Web 服務器的緩存模式,它有沒有影響在 瀏覽器中的任何客戶端緩衝。 [...]

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

即使瀏覽器可能會在顯示它之前緩衝其輸入。的Netscape, 例如,緩存器的文本,直到它接收到一個端部的行或 開始標記的,並且直到最外 表的標籤被認爲是它不會呈現表。

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

+0

對不起錯字錯誤(其flush()不fflush()) – Makesh 2012-07-20 12:47:10

+0

不起作用... – user198989 2012-07-20 13:14:27

0

你看到的效果是輸出緩衝。調用flush()函數強制php發送待定輸出。

請仔細閱讀不同的警告和可能出現的不同情況和不同服務器類型的限制。

+0

我記得我有我的xampp服務器上使用它的問題。 – Leri 2012-07-20 12:42:23

+0

@PLB請參閱我參考的php手冊頁,不幸的是,這並不像在循環結束時使用flush()那樣簡單,有幾種平臺依賴關係和交互可能需要應對。 – fvu 2012-07-20 12:45:21

1

我的腳本只有在它完成後纔回聲。

它可能會 - 但你沒有提供足夠的信息來確定是否是這種情況。

很有可能您的問題是this one的重複。

如果您在echo之後添加flush()並從命令行運行它,您將看到進度。

3

您將需要設置緩衝輸出。試試下面的腳本。確保您切換輸出的壓縮以查看實時輸出。

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

$f=fopen("list.txt","r"); 

if($f){ 

    while (!feof($f)) { 

     $line = fgets($f, 4096); 
     $lncount++; 
     $val = $lines[$lncount]; 
     mailsender($line,$yollayan,$sifresi,$name); 
     echo " sent"; 
    } 
} 
+0

沒有工作。不打印任何東西。 – user198989 2012-07-20 13:01:29