SQLを約1600回実行したら、5秒後にページを再読み込みします。
print "<html><body onload=\"setTimeout('location.reload()',5000)\">";
foreach ... {
...
# 約1600回繰り返す
@result = select("SQL文");
...
}
sub select{
my @result = ();
my($dbh, $sth);
$dbh = DBI->connect('DBI:mysql:データベース:localhost', "ID", "パスワード") or return 0;
$sth = $dbh->prepare("$_[0]");
$sth -> execute() or return 0;
$num_rows = $sth->rows;
$num_of_fields = $sth->{NUM_OF_FIELDS};
$result[0] = $sth->rows;
for ($i=1; $i<=$num_rows; $i++) {
@fetchrow_array = $sth->fetchrow_array;
$result[$i] = join ',', @fetchrow_array
}
$sth -> finish();
$dbh -> disconnect();
return @result;
}
最初の1,2回は期待通りに動くのですが、
2,3回ほど再読み込みをすると、「読み込み中」のままになってしまいます。
(期待通りに動く場合、1回の読み込みは20秒程度です。)
タスクマネージャを見ると、
期待通りに動いているときは、CPU使用率が60%くらいになっていますが、
「読み込み中」のままの時は1%程度になっています。
SQLサーバーから応答がなくなっているのでしょうか?
(簡単なSQLにしてみても同じでした。)
原因がわかる方、よろしくお願いします。
WindowsXP SP2
Apache1.3
ActivePerl5.6
MySQL3.23
No.3ベストアンサー
- 回答日時:
エラーの根本解決にはならないと思いますが、
foreach の外でconnect&disconnectして、select命令に$dbhを引き数として渡すようにしてはいかがでしょう? 用は、DB接続を約1600回から1回に減らすと言う案です。
>foreach の外でconnect&disconnectして、select命令に$dbhを引き数として渡すようにしてはいかがでしょう?
この方法でうまく動きました!
$dbh = DBI->connect(...);
foreach ... {
...
# 約1600回繰り返す
@result = select("SQL文", $dbh);
...
}
$dbh -> disconnect();
接続と実行を分けるところまで考えが回っていませんでした。
丁寧なアドバイスありがとうございました。
No.2
- 回答日時:
Premature end of script headers は、Content-typeを出力する前に何らかの原因で別の文字列が出力されてしまうと出ることがあります。
return 0 する代わりに、 die DBI->errstr なんてしてみると、もうちょっと詳細のエラーメッセージ見れたりしません?
セッションはshow processlist で見れますが、今回は接続に失敗しているので、セッションは存在しないと思います。
後、前回の回答に書いた部分は試して頂けましたか?
>return 0 する代わりに、 die DBI->errstr なんてしてみると、もうちょっと詳細のエラーメッセージ見れたりしません?
Apacheのエラーログに以下のように残りました。
[Sat Jun 09 15:11:39 2007] [error] [client 192.168.0.6] DBI connect('データベース:localhost','',...) failed: Can't connect to MySQL server on 'localhost' (10048) at c:\\PROGRA~1\\APACHE~1\\apache\\cgi-bin\\プログラム名.CGI line 68\n
[Sat Jun 09 15:11:39 2007] [error] [client 192.168.0.6] Can't connect to MySQL server on 'localhost' (10048) at c:\\PROGRA~1\\APACHE~1\\apache\\cgi-bin\\プログラム名.CGI line 68.\n
10048というエラーがあるので調べてみましたが、
OS(WindowsXP、2003Server)に原因があるのかもしれません。
http://www.mysql.gr.jp/mysqlml/mysql/msg/13216
http://72.14.253.104/search?q=cache:-MRJssTOuB0J …
とりあえず、「MySQLからまとめてSELECT→perlで細かく処理」する方法を試してみます。
>後、前回の回答に書いた部分は試して頂けましたか?
$sth->rows の箇所は教えていただいたように修正しました。
ありがとうございました。
No.1
- 回答日時:
補足をお願いしたいのですが、
(1) Apacheのエラーログには何も出てないですか?
(2) 読み込み中のときのアクセスに対するApacheのアクセスログ
は残ってますか?
(3) 読み込み中のとき、MySQLにセッションは張られていますか?
なお、今回の不具合と関係があるかは定かではないですが、このソースにまずいところがあります。それは$sth->rows です。このメソッドはDELETEやUPDATEでの使用を想定していて、SELECT 文では使用することはお勧めできないとドキュメントにも書いてあります。whileでfetchしても何も返って来なくなるまで回すのが普通のやり方です。
while(@row = $sth->fetchrow_array) {
# 処理
}
この回答への補足
遅くなって申し訳ありません。わかる範囲で調べてみました。
>(1) Apacheのエラーログには何も出てないですか?
[Thu Jun 07 12:06:12 2007] [error] [client 192.168.0.6] Premature end of script headers: c:/program files/apache group/apache/cgi-bin/プログラム名.cgi
[Thu Jun 07 12:06:12 2007] [error] [client 192.168.0.6] DBI connect('データベース:localhost','',...) failed: Can't connect to MySQL server on 'localhost' (10048) at c:\\PROGRA~1\\APACHE~1\\apache\\cgi-bin\\プログラム名.CGI line 67\n
[Thu Jun 07 12:06:12 2007] [error] [client 192.168.0.6] DBI connect('データベース:localhost','',...) failed: Can't connect to MySQL server on 'localhost' (10048) at c:\\PROGRA~1\\APACHE~1\\apache\\cgi-bin\\プログラム名.CGI line 67\n
[Thu Jun 07 12:06:12 2007] [error] [client 192.168.0.6] DBI connect('データベース:localhost','',...) failed: Can't connect to MySQL server on 'localhost' (10048) at c:\\PROGRA~1\\APACHE~1\\apache\\cgi-bin\\プログラム名.CGI line 67\n
...(同じように続く)
67行目はMySQLに接続しようとする場所です。
$dbh = DBI->connect('DBI:mysql:データベース:localhost', "ID", "パスワード") or return 0;
"Premature end of script headers" とあるので調べてみたら、
「Content-type: text/html\n\nを出力していない場合が考えられます」とありました。
最初の数行は以下のようなものです。
#!/Perl/bin/perl
require './jcode.pl';
require './cgi-lib.pl';
&ReadParse(*in);
print "Content-type: text/html\; charset=shift_jis\n\n";
...
また、「パーミッションを755にしたら解決した」という記事もあったのですが、
Windowsであることと、正しく処理できることもあることから、関係ないかと思います。
>(2) 読み込み中のときのアクセスに対するApacheのアクセスログは残ってますか?
192.168.0.6 - - [07/Jun/2007:12:04:52 +0900] "GET /cgi-bin/プログラム名.cgi HTTP/1.1" 200 382
192.168.0.6 - - [07/Jun/2007:12:05:04 +0900] "GET /cgi-bin/プログラム名.cgi HTTP/1.1" 200 382
192.168.0.6 - - [07/Jun/2007:12:06:12 +0900] "GET /cgi-bin/プログラム名.cgi HTTP/1.1" 500 605
1,2行目は期待通りに処理したときのもので、3行目が読み込み中のままになったときのものです。
(読み込み中が続いたので、途中で中止しました。)
500とあるのでサーバーエラーのようです。
>(3) 読み込み中のとき、MySQLにセッションは張られていますか?
どのように確認したらよいのかがわかりませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで集計したい。
-
めちゃきれい
-
(フリーの)ツリー掲示版CGI、...
-
apacheでPerl CGIが作動せず、5...
-
CGI.pmはもう古い!?
-
POSTメソッドの最大容量について
-
3DCG
-
ホームページにメールフォーム...
-
cgiからsendmailを送信で文字化け
-
フォームを再送信しますか?
-
/bin/awk '{print $5}'ってどう...
-
入力フォーム(電話番号)
-
誕生日占いをプログラムで作成...
-
number 改行が追加できない
-
生成AI画像について
-
cgi アクセス制限 エラー
-
CGIの記述について教えてくださ...
-
CGIの設置が分かりません・・・
-
ホームページにCGIを設置したの...
-
ホームページにCGIを設置したの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#でDLLファイル読み込みを行う...
-
WebBrowserでgoogle検索するには?
-
GetPrivateProfileString変値
-
C言語 バッファについて。
-
ヤフオクの画像拡大機能が
-
ハードディスク DVD 読み...
-
onPressに関する質問
-
IEを複数立ち上げていると勝...
-
外部ファイルからのデータの読...
-
ado db
-
C#でブラウザのタイムアウト処理
-
PCでのツイッター閲覧について
-
ipadでdブックがとんでもなく遅...
-
フレーム内に移動したい
-
ドロップフレームの計算をエク...
-
Access2010でサブフォームのフ...
-
phpで音を鳴らす
-
フレーム内のオプションボタン...
-
VB6のスクロールバー付きフレー...
-
【C#】wavファイルの複数同時再生
おすすめ情報