おそらく、Mysqlのセッションがタイムアウトしてしまっていると思われる。確かに若干sleepを長くしすぎていたかも
とりあえず、セッションの有効時間を調べてみる
SHOW VARIABLES LIKE ‘wait_timeout’
英語ですが、下記のページがまとまっていると思います。
http://blog.taragana.com/index.php/archive/mysql-tip-mysql-servh…
ざっくり概要を訳してみると(間違っていたらゴメンナサイ…)
- 保持しているコネクションが、デフォルトでは8時間以上、やりとりが無かった時に切断される。PHP でコネクションプーリングしている場合が多い。
- ロジックの誤りでコネクションを閉じちゃっている場合。例えば、マルチスレッドのアプリケーションで、別のスレッドが閉じている、とか。
- クライアント側からタイムアウトが通知された場合。
- クライアント側の自動再接続機能が無効にされている状態で、サーバ側でタイムアウトが発生した場合。
- 巨大なクエリーや誤ったクエリーを投げた場合。
- INSERT や REPLACE で、大量の行をソートしなければいけないような場合。
- クライアントバージョンが 4.0.8 より古くて、サーババージョンが 4.0.8 以降の場合に、16MB 以上のパケットを送った場合。
稀なケースとして、
- 管理者が MySQL のサーバを止めちゃった場合。
- クライアントがサーバと別のホストで動いていて、接続するための権限を十分に持っていない場合。
- Windows の場合、たぶん、タイムアウトが起きてコネクションが閉じられたんだけど、OS から十分なエラー情報が得られないので、結果、このエラーメッセージになる。
- 5.0.19 よりで、自動再接続フラグが有効になっていても、うまく再接続出来ない場合がある。
- 名前解決に失敗しているケース。
- –skipe-network オプション付きでサーバが起動されている場合。
- アプリケーションの全ての子プロセスが、同じコネクションを使おうとしている場合。
- ファイヤーウォールで MySQL サーバが使うポートがブロックされた場合。
- クエリーを処理中のサーバが死んじゃった場合。
- というのが挙げられています。
関係ありそうなもの、無さそうなもの、玉石混交ですが、参考まで。
なんとなく、PHP のコネクションプーリングの問題のような気がするけど。
http://q.hatena.nh.jp/1267971507
また、PHPにはmysql_pingというmysqlとの接続を確認して、切断されていたら再接続する関数がある様子
MySQL server has gone away – 揮発性のメモ
ただし、MySQL 5.0.13 以降、自動再接続機能は使えなくなったようなのでバージョンに注意
PHP: mysql_ping – Manual