- ベストアンサー
レスポンスタイムアウトの回避?headerの操作?
お世話になります。 題名が分かりにくくてすみません。 以下のソースでお聞きしたいことがあります。 test.htmlからdownloadリンクを押下すると、 downloaded.txtを保存するかどうかユーザにプロンプトが表示されます。 そしてdownloaded.txtにはtest1~test6までの内容が出力されております。 やりたい事は、ブラウザにtest1~test3を表示し、 その後、downloaded.txtにtest4~test6の内容が出力されるようにしたいと考えております。 なぜそうしたいのかと言いますと 実際はtest4~test6までを吐き出す処理時間が長く apacheのレスポンスタイムアウト?の5分に引っかかり ブラウザには何も返されない状態になっているからです。 ですから、レスポンスタイムアウトになる前に ブラウザに何かしらを返せば、 タイムアウトにならずに思ったとおりの動作をするのでは と思った次第であります。 代案でも構いませんので、ご教授宜しくお願い申し上げます。 ------------ test.html ----------------------- <a href="download.php">download</a> ------------ test.html ----------------------- ------------ download.php ----------------------- <?php echo "test1"; echo "test2"; echo "test3"; header("Content-type: application/txt"); header("Content-Disposition: attachment; filename=downloaded.txt"); echo "test4"; echo "test5"; echo "test6"; ?> ----------------------------------------------------
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ブラウザにtest1~test3を表示し、 >その後、downloaded.txtにtest4~test6の内容が出力されるようにしたいと考えております。 一回の実行では出来ないことをやろうとしているようです。 ブラウザ表示用のheaderを送信したら、もうその送信ではダウンロードにはなりません。 全部ダウンロードにするか、全部ブラウザ表示にするか、実行を分けてブラウザ表示用とダウンロード用を別々に呼び出すかのいずれかです。
その他の回答 (2)
解決策になるかどうかわかりませんが、ファイルのダウンロードであれば、 header("Content-type: application/txt"); ではなく、 header("Content-Type: application/octet-stream"); header("Content-Length: ".$length); //ファイルサイズ header("Accept-Ranges: bytes"); とする方が良いと思います。 ダウンロードしています...のダイアログすら出ないようなら 関係ないかもしれませんが、試してみて下さい。
お礼
tdsh様、ご教授ありがとう御座います。 header("Content-Type: application/octet-stream"); にした方がよいですね。 で、試したところ、だめでした。
- NINJA104
- ベストアンサー率43% (133/306)
flush()を一定間隔でコールするのでは駄目なのでしょうか? http://jp2.php.net/manual/ja/function.flush.php
お礼
NINJA104様、ご教授ありがとう御座います。 flush()をコールしてもだめでした。
お礼
hrm_mmm様、ご教授有難う御座います。 >一回の実行では出来ないことをやろうとしているようです。 ブラウザに何かしらのレスポンスを返してから ダウンロードは出来ないようですね。 >全部ダウンロードにするか、全部ブラウザ表示にするか、実行を分けてブラウザ表示用とダウンロード用を別々に呼び出すかのいずれかです。 そうですね。headerの操作で出来るかな!?とも思ったのですが。 どうも有難う御座いました。