実行に数分かかるスクリプトがあります。最初に mysql 接続が確立され (mysql_connect)、いくつかのクエリを含むループが続きます (mysql_query)。このループは非常に長く続き、数分後、スクリプトは mysql サーバーがなくなったという警告をスローします (指定された引数は有効な MySQL 結果リソースではありません)。
クエリが実行され、結果が取得された場合でも、一定の実行時間後に接続が自動的に閉じられますか?
実行に数分かかるスクリプトがあります。最初に mysql 接続が確立され (mysql_connect)、いくつかのクエリを含むループが続きます (mysql_query)。このループは非常に長く続き、数分後、スクリプトは mysql サーバーがなくなったという警告をスローします (指定された引数は有効な MySQL 結果リソースではありません)。
クエリが実行され、結果が取得された場合でも、一定の実行時間後に接続が自動的に閉じられますか?
「指定された引数は有効な MySQL 結果リソースではありません」とは、mysql_...() 関数が結果リソースを渡すことを期待しているが、他の何かを渡したなどのことを意味します。
$result = false;
$row = mysql_fetch_array($result, MYSQL_ASSOC);
// => Supplied argument is not a valid MySQL result resource
では、なぜ $result は になるのfalse
でしょうか? ほとんどの場合、前のクエリが失敗し、スクリプトにエラー処理がないためです。すべてのクエリは失敗する可能性があり、それを防ぐためにできることは何もありません。したがって、何らかのエラー処理が常に必要であり、スクリプトが結果がない場合 (ただしエラー状態) に結果を処理しようとしないようにします。最も単純なエラー処理は、エラーが発生するたびにスクリプトを停止させることです。
$sql = 'SELECT x,y,z FROM ...';
$result = mysql_query($sql, $mysql) or die(mysql_error());
mysql_query()false
は、エラーがあった場合に返します。その場合、ステートメント afteror
が実行されます。つまり、クエリが失敗した場合、php は MySQL の最後のエラー メッセージを出力してから終了します。
ただし、もう少し高度なエラー処理ルーチンを実装したい場合があります...
たとえば、PDOオブジェクトが PDO::ERRMODE_EXCEPTION に設定されている場合、エラーが発生するたびに例外がスローされます。(単純な)戻り値と比較して、それを見逃すのは少し難しいです。
編集:これは元の回答を完全に書き直したものです。最初の提案は、wait_timeoutの値を調べることでした。