2012-01-02 11 views
0

私は私のウェブサイトからのダウンロードを許可するには、次のコードを使用しようとしています:PHPの印刷(のfread(...))

while(!feof($file)) { 
    print(fread($file, 1024*8)); 
    flush(); 
    if (connection_status()!=0) { 
     @fclose($file); 
     die(); 
    } 
} 
@fclose($file); 

それは20メガバイトの下で、ファイルに素晴らしい仕事をしているが、私は最近、150MB前後のファイルを提供し、すぐに80MBをダウンロードしていないことがわかりました。

致命的なエラー:メモリ不足(82313216を割り当てられる)(81530881バイトを割り当て しようとした)

多くの研究の後、私は不完全なファイルの最後の数行でメモリ不足エラーを見つけました

print(fread(...))は、ファイルから(1024 * 8)バイトを割り当てて読み込み、printでそれらをダンプし、同じ8192バイトを使って次のセクションを読み込んだりダンプしていたファイル。

明らかに私は何か間違っている、誰でも私が実際にここで起こっていることを理解するのを助けることができますか?問題の回避策はありますか?ありがとう!

更新:エラーメッセージがある、302行を参照:

while(!feof($file)) 

はまた、ブラウザが適切にプログレスバーを表示するので、私は、ファイルサイズが正しく送信されて知っています。

+0

は、なぜあなたはのReadFile() ''は使用しないでください(http://php.net/readfile)(追記として:その通常は悪いアイデアは、静的なコンテンツを渡しますただPHPを介して可能性があるため)。それは「[80MB]を割り当てようとしました」と言います。あなたは確かに、これは実際にコードであり、エラーを引き起こしますか? – KingCrunch

+0

エラーメッセージは、通常、正確な行を指摘する必要があります。 –

+3

アウトバットのバッファリングを使用していますか?それでも、小さなファイルに出力しようとしても、ファイル全体がメモリに吸い上げられます。 –

答えて

0

これを確認してください:

if ($file!=false){ 
     while(!feof($file)) { 
     print(fread($file, 1024*8)); 
     flush(); 
     if (connection_status()!=0) { 
      @fclose($file); 
      die(); 
     } 
     } 
     @fclose($file); 
    }