• 締切済み

データサイズでクエリ中止?

PHPとmySqlにて、DBデータのCSVダウンロード機能を作成中です。 抽出条件次第で膨大なクエリ送信回数となり、画面が真っ白になってしまいます。 画面が真っ白になる理由は、おそらくタイムアウト?のようなものだと思っています。 for文でクエリ送信し続けているので・・・ そこで、 1.正常に処理を終えるには、どのような手段があるでしょうか。 2.サーバーが2MBのデータまでしかダウンロードできないようなのですが、  判別するにはPHP側でどのような手段があるでしょうか。 クエリ文を見直して送信回数を減らす案以外でご教示願います。

みんなの回答

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

>for文でクエリ送信し続けているので・・・ となる時点で設計がまずかったとしか思えませんが、他に打つ手がないのなら分割実行するしかないですね。 クエリひとつごとにファイルに書き出して、locationヘッダなどで再処理していくしかないでしょう。 (e.g.) <?php session_name('pathchk'); session_start(); $max = isset($_SESSION['max']) ? intval($_SESSION['max']) : 1; $path = isset($_SESSION['path']) ? intval($_SESSION['path']) : 1; if ($path > $max) { $path = 1; } if ($path == 1) { // 実行するクエリのセット $max = 5; $_SESSION['sql'][1] = '1番目のクエリ'; $_SESSION['sql'][2] = '2番目のクエリ'; $_SESSION['sql'][3] = '3番目のクエリ'; $_SESSION['sql'][4] = '4番目のクエリ'; $_SESSION['sql'][5] = '5番目のクエリ'; $_SESSION['max'] = $max; } $sql = $_SESSION['sql'][$path]; //-- デバッグ用ここから(クエリ実行→CSV保存の代わり) $fh = fopen('test.txt', 'a'); fputs($fh, $sql . PHP_EOL); fclose($fh); sleep(3); //-- デバッグ用ここまで $_SESSION['path'] = ++$path; if ($path <= $max) { header('Location: ' . $_SERVER['SCRIPT_NAME']); } else { print "Done"; }

retro_s
質問者

お礼

お礼が遅くなってしまい申し訳ありませんでした。 解決しました。

回答No.2

PHP経由なら何回かに分けてダウンロードする(ページング)とか。 サーバーの設定にもよるでしょうけど、 SELECT * FROM table_name INTO OUTFILE '/public_html/path/data.csv' などとしてcsvファイルにエクスポートして、http://example.com/path/data.csvにアクセスしてダウンロードとか。

retro_s
質問者

お礼

お礼が遅くなってしまい申し訳ありませんでした。 解決しました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>クエリ文を見直して送信回数を減らす案以外で それ以外にないですね

retro_s
質問者

お礼

お礼が遅くなってしまい申し訳ありませんでした。 解決しました。

関連するQ&A