PHPでError while sending STMT_PREPARE packetとかいうエラーの解決策

環境

Raspberry PI2 model B
PHP 7.0.30
mysql Ver 15.1 Distrib 10.1.23-MariaDB

経緯

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]
を消すとかしてみるといいんじゃないかな


以上