• ベストアンサー

大容量CSVファイルをダウンロードするには

お世話になります。 PHPを使ってOracleのデータをCSV化しようとしています。 データサイズが400MBくらいなので簡単に、 Maximum execution time of *** seconds exceeded とか Allowed memory size of **** bytes exhausted になってしまいます。 途中で分割して送る方法があれば、 教えていただきたいと思います。 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5067/13241)
回答No.2

header("Content-Type: application/octet-stream") header("Content-Disposition: attachment; filename=$csv_file"); echo [CSVの1行目にDBのカラム名] ----ループの始まり [DBから取り出し] [DBから取り出したデータの編集] echo [DBから取り出して編集したカンマ区切りデータ] ----ループの終わり としたらいいんじゃないでしょうか

freeradical
質問者

お礼

本当に助かりました。 ありがとうございます。

freeradical
質問者

補足

実行してみました。 1回目のループでダウンロードを開始した後、 2回目以降が連続してダウンロードされます。 DBアクセス ->ダウンロード  DBアクセス ->ダウンロード ・ ・ のような分割イメージにはなりませんでしたが、 逆に、ユーザが途中に介在しないので、 こちらのほうが理想的です。 しかも、 Maximum execution time of *** seconds exceeded とか Allowed memory size of **** bytes exhausted が出なくなり、元々の悩みが解決しました。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5067/13241)
回答No.1

Maximum execution time ・・・ に対しては set_time_limit(0); とかすればスクリプト実行のタイムアウトを防げます。 Allowed memory size ・・・ に対しては、Oracleから一度にデータ全件を取り出さずに、少し取り出して出力、続きを少し取り出して出力といった感じで徐々に処理するようにすればメモリの消費を抑えられます。 もしくは、予めCSVファイルを作っておいて、それをダウンロードさせるという方法も検討してはいかがでしょうか。

freeradical
質問者

補足

Oracleから少しずつ取り出すところまでは出来ているので、 あとは、 DBアクセス ->ダウンロード  DBアクセス ->ダウンロード ・ ・ ・ という分割イメージを実現できれば良いのですが、 途中でユーザにダウンロードさせる、 というのをどうやるのかがよくわかりません。 それが質問のきっかけになったのですが、 現在は、テーブルの一定行の単位にループを回しており、 DBアクセス毎にheaderを書いて、 取得したデータをechoしてます。 ----ループの始まり header("Content-Type: application/octet-stream") header("Content-Disposition: attachment; filename=$csv_file"); $myData = CSVの1行目にDBのカラム名 $myData .= DBから取り出して編集したカンマ区切りデータ echo $myData; ----ループの終わり これだと、最後に作ったCSVしかダウンロードできず、しかもカラム名がループ回数分続くだけでした。 よろしくお願いします。

関連するQ&A

  • ローカルで動いているPHPがタイムアウトする

    ローカルで動かしているPHPプログラム (他のサイトからソースを自動取得するシステム) を動かしているのですが 巡回するサイトが多いため Maximum execution time of 60 seconds exceeded とエラーが発生してしまいます。 PHP.iniの max_execution_time = 60 max_input_time = 60 の箇所を max_execution_time = 360 max_input_time = 360 へ post_max_size = 20M upload_max_filesize = 20M をそれぞれ100MBへ変更しましたが Fatal error: Maximum execution time of 60 seconds exceeded とエラーが表示されます。 どなたか恐縮ですがこの問題に長けている方のご返信をお待ちしています。 それでは宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • Fatal error Maximum execution time

    Fatal error Maximum execution time of 0 seconds exceeded in ~ 「max_execution_time」をゼロ(無制限)にしても上記エラーが出る場合があります。 これはいかなるエラーなのでしょうか。 ご教示いただけると幸いです。

    • 締切済み
    • PHP
  • phpmyadminが動かなくなりました。

    すみません、色々動かしていたら、phpmyadminがタイムアウト?してしまいました。 この表示は初めてです。 Fatal error: Maximum execution time of 30 seconds exceeded どのようにすればよいでしょうか? ちなみに、今日はAVGのアップデートとスキャンが掛かってしまって、PCが非常に重いのですが、その影響でしょうか???

    • ベストアンサー
    • PHP
  • タイムアウトについて

    Maximum execution time of 30 seconds exceeded というエラーが出てしまいました。 確かにソースは長いのですが、内容としてはDBを読み、その内容をHTMLではきだす、といったものです。 php.iniの設定は、「safe_mode = Off」になっています。 Resource Limitsで、max_execution_time = 30になっていたのを、max_execution_time = 360に治しましたが、変化ありませんでした。 どうしたら、タイムアウトを長くできますか? ループを抜けることができないといった状況はありません。 教えて下さい。宜しくお願いします。

    • 締切済み
    • PHP
  • Maximum execution time of 30 seconds exceededの対応方法

    PHP+MySQL+Apache+Unixのホスティングサービス環境で作業をしているのですが、長いSQL文(INSERT文のみ)をPHPから実行すると、「Maximum execution time of 30 seconds exceeded」というエラーが出てしまいます。 max_execution_timeを変更すれば、解決するのは分かっているのですが、ホスティングなので変更が出来ません。 ほかに対応方法はないでしょうか?

    • ベストアンサー
    • PHP
  • symfonyのsfThumbnailPluginを使用した際に↓のよ

    symfonyのsfThumbnailPluginを使用した際に↓のようなエラーがでました Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 16000 bytes) どなたか解決方法しりませんか??

    • 締切済み
    • PHP
  • british national corpus

    以前までBNCが使えていたのですが、最近クエリを入力しても Fatal error: Maximum execution time of 60 seconds exceeded in /var/www/html/saraWeb.php on line 63 と出るだけです。 この英語は何を表しているのでしょうか。 ちなみに、例がひとつもないようなクエリではないです。 なぜ使えないのでしょうか。 また、解決するにはどうすれば良いでしょうか。 早めにコーパスを利用したいので、どうぞよろしくお願い致します。

  • タイムアウト時に次の処理へ移行する方法

    Windows/AN HTTPDでPHP Version 4.4.9を動かしています。 fsockopenで処理を行なっているのですが、 タイムアウト時に次の処理に移行させる方法が分かりません。 foreachで繰り返し処理中にタイムアウトが出た場合、そこで処理が止まってしまいます。 (エラー内容: Maximum execution time of 30 seconds exceeded) set_time_limitを使った時間延長以外の方法で、 何か対策がありましたらご教授いただけませんでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • MAMPでsqlをインポートできない

    macカテゴリで回答が頂けなかったのでphpの方で再度質問させてください。 mampでphpmyadminを使って90Mのsqlをインポートしようとしたのですが ファイルサイズが大きすぎるため下記のようなエラーが出ました。 Fatal error: Allowed memory size of xxxxxx bytes exhausted phpinfoにてphp.iniファイルの場所を確認し該当するphp.iniの memory_limit post_max_size upload_max_filesize max_execution_time 等を大幅に増やして書き換えました。 MAMPを再起動しphpinfoで設定が反映されたのも確認したのですが どうしても上記のエラーが解消されません。 何か他に見落としている点はありますでしょうか? ご教授頂けますようお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのエラー文の解読

    ダウンロード失敗時にでるエラーなんですが、 このエラー文はどういう意味でしょうか? PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 9937 bytes) in /usr/share/pear/PEAR/XMLParser.php on line 258 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう