- 締切済み
データサイズでクエリ中止?
PHPとmySqlにて、DBデータのCSVダウンロード機能を作成中です。 抽出条件次第で膨大なクエリ送信回数となり、画面が真っ白になってしまいます。 画面が真っ白になる理由は、おそらくタイムアウト?のようなものだと思っています。 for文でクエリ送信し続けているので・・・ そこで、 1.正常に処理を終えるには、どのような手段があるでしょうか。 2.サーバーが2MBのデータまでしかダウンロードできないようなのですが、 判別するにはPHP側でどのような手段があるでしょうか。 クエリ文を見直して送信回数を減らす案以外でご教示願います。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- shimix
- ベストアンサー率54% (865/1590)
>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"; }
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
PHP経由なら何回かに分けてダウンロードする(ページング)とか。 サーバーの設定にもよるでしょうけど、 SELECT * FROM table_name INTO OUTFILE '/public_html/path/data.csv' などとしてcsvファイルにエクスポートして、http://example.com/path/data.csvにアクセスしてダウンロードとか。
お礼
お礼が遅くなってしまい申し訳ありませんでした。 解決しました。
- yambejp
- ベストアンサー率51% (3827/7415)
>クエリ文を見直して送信回数を減らす案以外で それ以外にないですね
お礼
お礼が遅くなってしまい申し訳ありませんでした。 解決しました。
お礼
お礼が遅くなってしまい申し訳ありませんでした。 解決しました。