2012-07-10 56 views
1

我使用echo輸出各種文件到瀏覽器,包括一些10MB + .swf文件。我遇到的一個負面影響是,它似乎與內容中的一些Flash預加載器混淆,導致圖像閃爍,而不是顯示穩定的進度條。我想知道是否有任何種類的緩衝或我可以做的其他事情來解決它。php回聲大塊數據

對於一些背景信息,我必須間接地提供內容的原因是,它只能用於授權用戶,因此腳本首先檢查用戶是否具有適當的權限,然後將readfile()echo配對。也許有一個更好的方法來完成它,我願意接受。

編輯

readfile()echo是說明它當然,的一種簡化的方式。其運行是這樣的:

<?php 
check_valid_user(); 
ob_start(); 
// set appropriate headers for content-type etc 
set_headers($file); 

readfile($file); 

$contents = ob_get_contents(); 
ob_end_clean(); 
if (some_conditions()) { 
    // does some extra work on html files (adds analytics tracker) 
} 

echo $contents; 
exit; 
?> 
+1

'readfile()'可能不會與'echo()'配對,因爲'readfile()'將其輸出直接寫入輸出緩衝區。 – nickb 2012-07-10 17:12:56

+0

看到一些相關的代碼會很好。 – deefour 2012-07-10 17:13:32

回答

0

你可以probly使用fopen/fread等串聯W /回聲& flush。如果您還沒有預先設置內容類型,您很可能需要致電header。另外如果你使用輸出緩衝,你需要撥打ob_flush

通過這種方式,您可以讀取較小的數據片段並立即回顯它們,而不需要在輸出之前緩衝整個文件。

0

您可能想要嘗試設置Content-Length標頭。

喜歡的東西

header('Content-Length: ' . filesize($file)); 
+1

我確實使用該行,以及其他六個相關的內容標題。 – SaltyNuts 2012-07-10 17:28:07

+0

您是否檢查過以確保標題設置爲正確的值? – bengert 2012-07-10 18:59:10

1

我認爲,緩衝是在這種情況下是多餘的。你可能會這樣做:

<?php 
    check_valid_user(); 
    // set appropriate headers for content-type etc 
    set_headers($file); 

    if (some_conditions()) 
    { 
     $contents = file_get_contents($file); 
     // does some extra work on html files (adds analytics tracker) 
     // Send contents. HTML is often quite compressible, so it is worthwhile 
     // to turn on compression (see also ob_start('ob_gzhandler')) 
     ini_set('zlib.output_compression', 1); 
     die($contents); 
    } 
    // Here we're working with SWF files. 
    // It may be worthwhile to turn off compression (SWF are already compressed, 
    // and so are PDFs, JPEGs and so on. 
    ini_set('zlib.output_compression', 0); 
    // Some client buffering schemes need Content-Length (never understood why) 
    Header('Content-Length: ' . filesize($file)); 
    // Readfile short-circuits input and output, so doesn't use much memory. 
    readfile($file); 
    // otherwise: 
    /* 
    // Turn off buffering, not really needed here 
    while(ob_get_level()) 
     ob_end_clean(); 
    // We do the chunking, so flush always 
    ob_implicit_flush(1); 

    $fp = fopen($file, 'r'); 
    while(!feof($fp)) 
     print fread($fp, 4096); // Experiment with this buffer's size... 
    fclose($fp); 
?>