2

別のインスタンスと同時に実行されないようにデータベース値を設定する一般的な 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)");
}

スクリプトの最後で、値はクリアされます。繰り返しますが、この問題はブラウザから実行した場合にのみ発生します。

4

1 に答える 1

0

次のように実行制限の値を長く設定する必要があります。

set_time_limit(30*60) // 30 minutes

また、エコー機能はおそらく機能していますが、スクリプト全体の実行が終了するまで応答がブラウザに送信されるため、終了して印刷する前に実行制限によって強制終了されるため、印刷が表示されない原因です。応答。

の助けを借りて、応答を部分的にエコーしてみることができます

ob_start

ob_flush

ob_functions の詳細については、こちらをご覧ください。

于 2013-10-12T08:42:21.933 に答える