CURL プロセスによって書き込まれているローカル ファイルを PHP からストリーミングする
質問
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 に処理させますか?