ERROR 2006 : MySQL server has gone away の対処法 (ロリポップ!などレンタルサーバーの場合)

In: php

11 9月 2013

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

解決しました。

コメント

Comment Form

About this blog

ここは、SE見習いである私ことdaceloが、日夜習得していくシステム関連の備忘録、phpやWordPressTipsのネタ、あるいはSEOやWebマーケティング関連の雑感を投稿するブログです。 平日は大体毎日投稿しています。土日は休業日です。

カテゴリー

カテゴリー

アーカイブ