CakePHP で SQL Error : 2006 MySQL server has gone away

mysql_ping() を実行すると延長できるので、
ループ処理内とかで実行するようにすればOK。

■環境
 ・さくらインターネット
 ・CakePHP 1.2.x
 ・MySQL 5.1.x

■経緯
 CakePHPの appvendorsshells にあるプログラムを
 定期的にcronで実行していたところ、

 「SQL Error : 2006 MySQL server has gone away」

 というエラーが発生し、DBにinsertできていなかった。

■原因
 MySQL側のwait_timeout(DB接続をopenにしている時間)の時間が
 過ぎてしまい、DB接続がcloseしてしまった。

■理由
 さくらインターネットでは、 wait_timeout = 300 (5分) となっていて、
 処理が5分以上かかっていたため、DB接続がcloseになっていた。
 (wait_timeout は、MySQLで「SHOW VARIABLES」コマンドで確認できる)

■対応策
 案1.my.cnf で wait_timeout を伸ばす
 → さくらインターネットでは編集できない

 案2.PHP側で mysql_query(‘SET GLOBAL WAIT_timeout=3000’)を実行し
 時間を延長する
 → さくらインターネットでは変更権限がない

 案3.ループ処理内でmysql_ping関数を実行する
 → これで解決。ループ処理ごとに都度DB接続のwait_timeoutが延長できた

■英語用
 [Q]
 What can I fix “SQL Error : 2006 MySQL server has gone away” error for CakePHP?
 I can’t edit my.cnf and excute mysql_query “SET”.

 [A]
 Run mysql_ping() to end of loop program. You can extend MySQL wait_timeout when end of loop program.