CURL プロセスによって書き込まれているローカル ファイルを PHP からストリーミングする

StackOverflow https://stackoverflow.com/questions/2034831

質問

Web サイト用に単純なプロキシ サーバーを作成しています。なぜ mod_proxy と mod_cache を使用しないのかは別の議論です。コードは次のとおりです。

    shell_exec("nohup curl --create-dirs -o {$write_path} {$source_url} > /dev/null 2> /dev/null & echo $!");
    sleep(1);

    $read_speed = 65.5; # 65.5 kb/s download rate
    $handle = fopen($write_path, "rb");

    $content_type = select_meta_item($headers, 'Content-Type');
    $file_size = select_meta_item($headers, 'Content-Length');
    send_headers($content_type, $file_size); 
    flush();

    while (!feof($handle))
    {
        echo fread($handle, round($read_speed * 1024));
        flush();
        sleep(1);
    }

    fclose($handle);

この方法では MP3 のストリーミングは機能しません。Chrome では再生できますが、Firefox では再生できません。最初はこれを使用して、Long Tail の JW Player を通じて MP3 ファイルをストリーミングします。すべてうまくいけば、これを使って ZIP ファイルを送信するつもりです。

役に立ちましたか?

解決 2

私はそれを考え出しました。コードは、それが正常に動作します。

ファイルは、404ハンドラ(のErrorDocument)によってAPACHEによって呼び出されていました。 Apacheは自動的に前呼び出されるPHPスクリプトに404ヘッダを送信します。

このファイル(上記のコード)は、CURL処理を開始し、ストリームファイルにリダイレクトしません。 Apacheは404を返したので、FirefoxはMP3応答を無視していました。 (一方、Chromeはしませんでした)。今、私はリダイレクトすること、それが正常に動作します。

他のヒント

問題は、ファイル形式がクライアント実装によってストリーミングできるかどうかです。もし Firefox は MP3 の再生をサポートしていません ダウンロードが完了するまでは、サーバー側でいくら工夫してもストリーミングを実現することはできません。フラッシュベースのインライン プレーヤーなど、クライアント側のサポートが必要になります。

ZIP ファイルの場合、エンコード テーブルが 終わり アーカイブの場合、ダウンロードが完了するまで、ソフトウェアはそれを開くことができません。

余談ですが、FIFO を作成することを検討しましたか? curl FIFO 入力で、適用する readfile FIFO 出力に接続して、OS に処理させますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top