経緯
PHPでPDOを使って処理をしようと思っていた
SQL文を用意してbindParam()のためにprepareしたら
PHP Warning: Error while sending STMT_PREPARE packet. PID=番号 in ファイル名 SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
というエラーが表示されてしまった
とりあえず、MySQLサーバーを再起動してPHPを再実行すると
このエラーは出なくなった
そしてしばらくすると、またこのエラーが発生した
当初はクソクエリかなんかを読ませてしまったのかと思って
いろいろと調べたけど、その観点は見当違いだった
原因
詰まる所、これはMySQLのタイムアウトの設定とプログラムの問題であった
PHPで
new PDO(ユーザーとかパスワードとか)
をしてから、そのリソースに対して
query、prepare
等をするまでの間に、DB側の設定である
wait_timeout
秒過ぎると、勝手にDBとの接続が切れるとわかった
そして、接続が切れたDBに対してクエリを入れようとすると
上述のエラーが発生する模様
(ここではSTMT_PREPAREだが、呼び出した関数によって恐らくこの部分は変わる)
解決策
プログラムで、wait_timeoutの秒数を超えたら
再接続、newするようにすればいいんじゃないかな
一応これで解決してる
あとは、DBの設定として
/etc/mysql/my.cnf
とかにある設定の中に
[mariadb] wait_timeout=指定したい秒数の整数値
の2行を付け足してやるといいんじゃないかな
(デフォルトだと8時間(=28800)の模様)
ついでに、MySQLをよびだして、
show global variables like '%wait%';
とかで設定が見れる
設定が反映されてなかったら
sudo /etc/init.d/mysql restart
するとか、上で付け足した
[mariadb]
を消すとかしてみるといいんじゃないかな
以上