• ベストアンサー

phpのプログラムで一定間隔で処理をする方法

phpのプログラムで一定間隔で処理をする方法 phpのプログラムで5秒に1回しか処理しない方法はありますか? 同時に2人がアクセスしても、2人目のアクセスは5秒待ち状態になるようにしたいです。 ユーザー側からのアクセスで実行されるのが前提なので、 制限の掛ける方法で悩んでいます。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

基本方針は回答1の通りでいいと思います。 最終実行時刻の記録は、「ファイルのタイムスタンプ」を使うのが簡単でしょう。 コードにすると、こんな感じ --- <?php lock_and_wait("flock.txt"); function lock_and_wait($filename) { $fp = fopen($filename, "ab+"); flock($fp, LOCK_EX); $stat = fstat($fp); $mtime = $stat[mtime];// タイムスタンプ=最終実行時刻取得 $next_execute_time = $mtime + 5; // 次回実行時刻を計算 $now = time(); // 現在時刻 $wait = $next_execute_time - $now; if ($wait > 0) { // 現在時刻が次回実行時刻より前の場合 sleep($wait); // 次回実行時刻まで待つ } ftruncate($fp, 0); //タイムスタンプ=最終実行時刻を更新 fclose($fp); } ?> --- これで、 lock_and_wait("flock.txt"); の関数呼び出しが、 ・1人目は、すぐに返ってくる ・2人目は、1人目の関数呼び出しより5秒経ってから返ってくる という動作になります。 この場合、「1人目の処理を始めてから5秒待つ」って挙動なので、 「1人目の処理が終わってから5秒待つ」にしたい場合は、もう一工夫要ります。

noname#225112
質問者

お礼

処理待ちのコードが大変参考になりました。 if ($limit > $wait > 0) { // 現在時刻が次回実行時刻より前の場合 として$limitを超えた場合エラーとして処理する方針で考えて見ます。 ありがとうございました。

その他の回答 (2)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

んー、正直、疑問だらけだったので、スルーしてたのですけど、一応、話に加わってみます。 とりあえず、このシステムの利用人数制限は何人なのでしょうか? 二人だけなら5秒待つだけで済みますが、二人目が待っている間に、三人目四人目と来たら、4人目は15秒待つ事になるのでしょうか? 一人目が5秒の間に、再度アクセスした場合はどうなるのでしょうか? 誰かがF5アタックのようなことをした場合、レスポンス待ちの長い行列ができる事になるのでしょうか?

noname#225112
質問者

補足

たしかに、 利用人数制限はないので、レスポンス待ちにも上限の制限が必要ですね。。。

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

前回実行した日時を見る if(前回実行した日時よりも5秒以上経過している){ 実行する 実行した日時を記録する }else{ 実行しない。 } でいいんじゃない? ポイントとなるのは、「実行した日時を記録する」 って部分かな。 実行した日時をどこに記録させるか。 が出来ればあとは簡単かと思います。 手っ取り早く作るならDBに保存するとか。 わざわざこんなことでDB使いたくないのであれば、memcacheなどを使うとか。 まぁ、もっと突き詰めると、ほぼ同時に複数アクセス有った場合の排他をどうするかって問題はでてきますけどね。

noname#225112
質問者

お礼

やはり物理的に日時保存は負荷が心配ですね。 ヒントにしてみます。 ありがとうございました。

関連するQ&A