2

サーバーに、データベースをチェックして値が定期的に (10 秒ごとに) 有効かどうかを確認する関数を呼び出させる方法はありますか?

したがって、実際に自分の側にアクセスしてjavascriptに作業をさせる必要はありません。サーバーは10秒ごとに自動的に関数を呼び出しますか?

4

2 に答える 2

2

非常に使いやすいWindowsタスクスケジューラがあります。10秒ごとの解像度が得られるとは思いません..おそらく1分ごとにスケジュールする必要があります。

タスク スケジューラ (Linux の場合は cron) アイテムをスケジュールして、1 分ごとに 3 ~ 4 回連続して実行することもできます。

for($x = 0; $x < 4; $x++) { 
    yourFunction();
    sleep(10);
}

このように、正確に 10 秒ごとではありませんが、1 分間に 4 回実行するスクリプトが作成されます。10 秒ごとに 6 回実行すると、スクリプトの実行にも時間がかかるため 60 秒以上かかり、オーバーラップが生じることに注意してください。

タスクスケジューラの方法または上記の方法を使用する場合、タスクスケジューラが以前に開始されたチェックスクリプトを実行している場合、次のようなセカンダリが実行されないように「ロック」を記述します。

if(is_readable('is_running')) { 
    die("Already have one running");
}

file_put_contents('is_running', date('r'));

// at the end of the script, remove is_running since it won't be running anymore
unlink('is_running');

そのdate('r')ため、問題がある場合は、ロックをテキスト エディターで開いて、ロックが最後に書き込まれた時刻を確認できます。繰り返しますが、これを非常に正確に行わない限り、(1) 1 分に 1 回を除いてスクリプトが実行され、2 つのスクリプトが実行され、多数のプロセスの雪崩が遅くなる可能性があります。ロックを使用すると、ロックが 60 秒以上瞬く間に続く場合、10 秒ごと、または 1 分おきに実行される可能性があります... (3) 他に何があるかは誰にもわかりません...これが理由です私の例では、1 分間に 2 回以上実行する必要がある場合は、10 秒の間隔を空けて 1 分間に 3 ~ 4 回実行することをお勧めします。(これは、スクリプトに比較的長い時間がかかる場合でも問題を引き起こす可能性があるため、もう一度..)

おそらくさらに問題が発生しやすい別の方法は、次のようなことを行う Windows サーバーで実行時間の長い PHP スクリプトを使用することです。

while(1) { 
    yourFunction();
    sleep(10);
}

ただし、プロセス時々ダウンする (死ぬ) ため、これは信頼できません。起動時にプロセスが開始することを確認し、サーバー上でコマンドライン スクリプトを常に実行しているブラック ボックスに対処する必要があります。また、長時間実行されるプロセスの場合、1 分ごとに正常に実行されていることを確認するために、追加のスクリプトが必要になる場合があります。

最後に、負荷の高いサーバーではこの方法をより多く使用しています...たとえば、10 秒ごとに 1 回以上のヒットが発生していることがわかっている場合、すべてのphp スクリプトに確率を導入できます (たとえば、インクルードとして、次のようなものを使用します):

if(mt_rand(1,100) < 10) {
    yourFunction();
}

または、負荷の高いサイトでの私の好みの方法は、apc、redis、または memcache などのメモリ ストア (負荷の高いサイトなので、既に使用していたもの) を使用し、単に「最終実行」時刻を保存することです。 10 秒以上前に、すぐに実行時間を更新してから関数を実行します。疑似例:

if($yourStore->get('last_garbage_collection') < (time() - 10)) { 
    $yourStore->set('last_garbage_collection', time());
    yourFunction();
}

最後の実行時間は、mySQL、セッション (ユーザーごとのガベージ コレクション、チェック スクリプトなど) などに保存することもできます。

そのため、Windows に関する限り、これを行う優れた方法は実際にはありません。私の提案は、10秒の解像度が必要な場合は、間違いなくタスクスケジューラ/ cronを毎分実行することです(本当に10秒ごとにチェックする必要がありますか?)、またはガベージコレクション時間のある最後の方法です。、それ常に 1 秒あたり数十またはそれ以上のリクエストを処理する負荷の高いサイトであり、常に実行されていない、壊れている、またはさらに悪化する可能性があることを認識しています。

于 2012-11-29T22:04:35.903 に答える
0

Windows 用のサードパーティのスケジューラがあり、このトリックを実行します。Windows のバージョンによって異なります。数年前、私は幸運にも Autotask 2000 を使用しました。新しいバージョンの Windows で動作するかどうかは不明です。

于 2012-12-01T21:18:11.930 に答える