1

ユーザーが大きなビデオファイルをダウンロードできるようにしたい。これらのファイルは、セキュリティ上の理由からパブリックフォルダの外にあります。

fopen()、feof()、およびfread()の組み合わせを使用して、ファイルをチャンクにダウンロードしています。

ダウンロードは正常に機能します。ビデオがダウンロードされ、問題なく動作します。問題はダウンロード中です。ファイルをダウンロードしているユーザーは、ファイルがダウンロードされるまでサイトを閲覧し続けることはできません。ブラウザは接続を確立しようとしていますが、ファイルのダウンロード中にハングします。ダウンロードが完了すると、接続はすぐに確立されます。他のユーザーはダウンロード中にサイトをうまく閲覧できるので、サーバー全体がハングするようなことはありません。

IISサーバーにインストールされているPHP(CakePHP)を使用しています。

コードのスニペット:

$name = "filename.mp4";
$folder = "private/folder/";

$handle = fopen($folder.$name, "rb");

if(!$handle)
{
    echo "File not found";
}
else
{
    header("Content-length:".filesize($folder.$name));
    header("Content-Type: video/mp4");
    header("Content-Disposition: attachment; filename='filename.mp4'");
    header("Content-Transfer-Encoding: binary");

    session_write_close(); // this is the solution  

    while(!feof($handle))
    {
        $buffer = fread($handle, 1*(1024*1024));
        echo $buffer;
        ob_flush();
        flush();
    }
}
4

1 に答える 1

3

私はついに問題を解決しました。上記のように、問題は実際にセッションに関連していました。session.auto_start がオフになっていても、現時点では CakePHP 自体がセッションを処理していました。そこで、session_write_close()while ループの直前に挿入することで、問題は解決しました。

于 2013-01-30T21:35:22.190 に答える