2009/09/03

phpで大きいファイルのダンプ

phpでファイルサイズの大きいもの、動画や音声ファイルなどをfopen,fread.echoで出力するときに30MB前後で出力が終わってしまうことがあります。
恐らくphpiniのmemory_limitの32MBに引っかかっているのだと思いますが、エラーが出ないのでなんともいえません。

下記のようにflush(),ob_flush()で出力することで回避できます。
flush()していないと、phpのコードが全て実行されてからブラウザの描画が始まるので、
どこかでメモリの制限が行われていると出力されないのだと思う。

  1. header('Content-Length: '.filesize($filename));  
  2. header('Content-Type: '. $contentype);  
  3. //キャッシュを有効に  
  4. header('Pragma: Private');  
  5. header('Cache-Control: Private');  
  6. header('Expires: '.gmdate('D, d M Y H:i:s',time() + 1800) . ' GM  
  7.   
  8. $handle = fopen($filename,'r');  
  9.   
  10. if ($handle) {  
  11.     while (!feof($handle)) {  
  12.         echo  fread($handle, 4096);  
  13.         flush();  
  14.         ob_flush();  
  15.     }     
  16.     fclose($handle);  
  17. }     
  18. die();  

Flash Playerからも接続も確認できました。