• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLが応答しなくなっているのか、CGIが読み込み中のままになってしまいます。)

SQLが応答しなくなる原因と対処方法

このQ&Aのポイント
  • SQLが応答しなくなっている原因として、CGIが読み込み中のままになっていることが挙げられます。
  • 質問文章では、SQLを約1600回実行した後にページを再読み込みしています。
  • 一部の場合、再読み込みをすると「読み込み中」のままになります。CPU使用率も1%程度になっています。

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

  • ベストアンサー
回答No.3

エラーの根本解決にはならないと思いますが、 foreach の外でconnect&disconnectして、select命令に$dbhを引き数として渡すようにしてはいかがでしょう? 用は、DB接続を約1600回から1回に減らすと言う案です。

dennyz_Q
質問者

お礼

>foreach の外でconnect&disconnectして、select命令に$dbhを引き数として渡すようにしてはいかがでしょう? この方法でうまく動きました! $dbh = DBI->connect(...); foreach ... {   ...   # 約1600回繰り返す   @result = select("SQL文", $dbh);   ... } $dbh -> disconnect(); 接続と実行を分けるところまで考えが回っていませんでした。 丁寧なアドバイスありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

Premature end of script headers は、Content-typeを出力する前に何らかの原因で別の文字列が出力されてしまうと出ることがあります。 return 0 する代わりに、 die DBI->errstr なんてしてみると、もうちょっと詳細のエラーメッセージ見れたりしません? セッションはshow processlist で見れますが、今回は接続に失敗しているので、セッションは存在しないと思います。 後、前回の回答に書いた部分は試して頂けましたか?

dennyz_Q
質問者

お礼

>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:www.hcm-pro.com/choiota/cat13/+MySQL+10048&hl=ja&ct=clnk&cd=5&gl=jp&lr=lang_ja&client=firefox とりあえず、「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) { # 処理 }

dennyz_Q
質問者

補足

遅くなって申し訳ありません。わかる範囲で調べてみました。 >(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