2009/09/03

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

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

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


header('Content-Length: '.filesize($filename));
header('Content-Type: '. $contentype);
//キャッシュを有効に
header('Pragma: Private');
header('Cache-Control: Private');
header('Expires: '.gmdate('D, d M Y H:i:s',time() + 1800) . ' GM

$handle = fopen($filename,'r');

if ($handle) {
while (!feof($handle)) {
echo fread($handle, 4096);
flush();
ob_flush();
}
fclose($handle);
}
die();

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