別のインスタンスと同時に実行されないようにデータベース値を設定する一般的な PHP メンテナンス スクリプトがあります。通常、cronjob を介して実行されます。
データベースの値をクリアし、cronjob をオフにしてこのスクリプトを手動で実行してみました。ブラウザーから実行するたびに、既に実行されているとすぐに終了します。
スクリプトはバックグラウンド プロセスとして約 30 秒間実行され、PHP がブラウザーが閉じられたことを検出したかのように自動的に終了します (完了するまでに約 15 分かかります)。
そこで、データベースの値が設定または読み取られたときにエコーするコードを追加しました。設定されているときはエコーせず、読み取られたときのみエコーしますが、データベースの値が毎回保存されていることがわかります。
cron から実行すると、スクリプトは常に期待どおりに終了します。
何が起こっているのでしょうか?サーバーは、ブラウザベースのリクエストごとにスクリプトを 2 回実行していませんか?
サーバーは Hive を実行するため、ディレクトリごとに異なる PHP バージョンを使用できます。これが何か関係があるかどうかはわかりません。
PHP 5.2.17 (default)
PHP 5.3.27 (dir this script is in)
Apache 2.2.25
実行するかどうかを決定するコードは、次のとおりです。
$DB = new DbConnector($db_name, $db_user, $db_pass);
if ($DB->queryOne("SELECT COUNT(*) FROM data_vars WHERE name = 'maintenance_running'")) {
exit('Already running!');
} else {
$DB->query("INSERT INTO data_vars (name, value) VALUES ('maintenance_running', 1)");
}
スクリプトの最後で、値はクリアされます。繰り返しますが、この問題はブラウザから実行した場合にのみ発生します。