ERROR 2006 : MySQL server has gone away の対処法 (ロリポップ!などレンタルサーバーの場合)
WordPressの自作プラグインを動かしていた所、どうもMysqlクエリがうまく実行されないことが多い。
念の為、生成されているSQL文をコピーしてphpMyAdminで実行してみるとちゃんと動作するので、SQL文のエラーではない。
mysql_error()でエラー確認
PHPプログラムでMySQLエラーが出る時は、エラーを調べる関数mysql_error()を使う。
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); mysql_select_db(DB_NAME); echo mysql_errno($link) . ": " . mysql_error($link). "\n"; |
動かしてみると、
ERROR 2006 : MySQL server has gone away
と表示された。「MySQLサーバーは行ってしまった…」
広告
どこへ!?
MySQL server has gone away
このエラーは、多くの場合はタイムアウトを意味する。ただし
エラーの最も一般的な原因は、サーバがタイムアウトして接続がクローズしたことです。デフォルトでは、何も起きない状態が 8 時間続くと、サーバは接続をクローズします。
とのことなので、今回は違う。せいぜい20秒くらいしかかかっていない。
もう一つの原因は、大きすぎるクエリを送信しようとしたこと。試しにクエリを短くして実行してみたところ問題がなかったので、こちらの原因と断定。
大きすぎるクエリの場合の解決方法
my.cnfの max_allowed_packet のサイズを
max_allowed_packet = 8M
などちょっと大きめにしてあげれば解決する。
レンタルサーバーの場合の解決方法
しかし、今回はロリポップ!というレンタルサーバーなのであった。レンタルサーバーでは、まずmy.cnfの設定が変更できない。せいぜいphp.iniの設定までしか許されていない。
細かくプロセスを見ていくと、重めのループ処理をしているところでMySQLのコネクトが切れていることがわかった。
foreachの中でmysql_ping()を実行すると…
PHP: mysql_ping – Manual
解決しました。
This design is wicked! You obviously know how to keep
a reader entertained. Between your wit and your videos, I was almost moved to start my own blog (well, almost…HaHa!) Excellent job.
I really enjoyed what you had to say, and more than that,
how you presented it. Too cool!
This is very interesting, You are a very skilled blogger. I’ve joined your feed and look forward to seeking more of your
excellent post. Also, I have shared your site in my social networks!