• ベストアンサー

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

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

noname#225112
noname#225112
  • PHP
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • 一定間隔のタスク処理について

    現在、一定期間のタスク処理について悩んでいます。 あるプログラムをタスクトレイに常駐させています。 このプログラムは、DBにアクセスするプログラムで、15分間隔でDBにアクセスしようとしています。 当初は、  1.タイマーイベントで処理する。  2.Windowsのタスクを使用する。 と考えていたのですが、  1.タイマーのインターバル(最大)は、約65000で    15分は設定できない。  2.タスクは、プログラムが常駐している為、初回    実行のみ行われる。(つまりずっとタスク実行中    となる。) という問題にぶつかってしまいました。 何か良い方法はないでしょうか? http://oshiete1.goo.ne.jp/kotaeru.php3?q=571156 なども参考にはしてみたのですが・・・ どうかよろしくお願い致します。

  • 一定の間隔でプログラムを実行させたい

    PHP,MYSQLを使って、一日置きの間隔で 更新のプログラムを実行させたいのですが、 JAVASCRIPTではブラウザを開いていないと 実行されない為、他の方法を考えています。 簡単な方法で何かないでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHPのSleepについて

    PHPでTwitterでメンションされたら自動返信するプログラムを書いて、Lolipopのcronにて1分間隔で実行されるようにしています。 しかし、どうしても1分間隔だと返信までに時間がかかってしまう場合があり、もう少し間隔を狭くしたいと考えております。 そこで、PHPのSleep関数を使用して 、関数呼び出し→20秒待機→関数呼び出しというプログラムにしました。 (ちなみにLolipopはPHPの処理時間が30秒までに制限されています) ここで疑問なのですが、Sleepの状態でもサーバー側に高い負荷がかかってしまうものなのでしょうか。 このプログラムでも問題ないのか、もしくはやめておいた方がよいのか教えていただけたら幸いです。

    • 締切済み
    • PHP
  • 一定間隔でプログラムを実行するには?

    WindowsNTでプログラムを10分間隔で実行したいのですが、ATコマンドやタスクスケジューラでは分間隔の設定ができすに困っています。 良い方法がありましたらご教授よろしくお願いします。

  • 長時間かかるPHPプログラムの処理方法。

    長時間かかるPHPプログラムの処理方法。 PHPプログラムを作成したのですが、処理が終わるまでおそらく数時間掛るようなプログラムを作成しました… 普通にURLにアクセスしても途中でストップしてしまいます。 シェルスクリプトをかまして、CRONジョブで処理したら、サーバーの条件によって途中で止まってしまいます。 サーバーはXREAを使用しています。CRONジョブは3分以上の処理はダメなようです。 長時間のプログラムを処理する方法はあるのでしょうか? 専用サーバーを使う必要があるなら、そういった事が可能でサービス的に良いところを教えてくれると助かります。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのプログラムが同時に呼び出された場合について

    PHPで同時に同じプログラムが呼び出された時、 WEBサーバでは、同時にプログラムが実行されるのでしょうか? それとも、先に呼び出された処理が終るのを待ってから、 後の処理が実行されるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • サーバー側の処理の進行状況を表示させる方法について

    どこで質問するべきか迷ったのですがここで質問させていただきます。 はじめて簡単なWebサービスを作っています。作っていて疑問に思ったのことがあったので質問します。 よくWebサービスでユーザーのアクションに対して「保存中です」や「処理中です」のダイアログ等で知らせたり、またその時にプログレスバーなどで処理の進行状況など表示してくれる場合もあると思います。 その実現方法についてどんな方法があるのかという質問です。 サーバー上でphpのプログラムを動かすという前提で考えています。 Ajaxで結果をそのページに表示させるという場合で考えてみました。 私が思いつく方法はユーザーのアクションがあった時に「処理中です」等のダイアログを表示させてjQueryでサーバーのphpを呼び出し、処理が終ったらダイアログを閉じて、結果を表示させるという方法です。 初歩的なことであれですが、そもそもphpの処理が終るのが長い時、jQueryはphpの処理がちゃんと終わってから結果を受け取るのでしょうか? 問題はどうやってphpの進行状態をどうやって受け取るかということだと思うのですが、この実現方法は可能で正しいですか? また、進行状況を表示(現在何%くらいの処理なのか等)プログレスバーで表示させる場合の実現方法が思いつきませんでした。 こちらも呼び出したphpの状況をどうやって受け取るかということだと思うのですが、phpが処理の途中で別ファイルに状況を書き出してそれを一定間隔でjavaScriptが調べにアクセスするとかですか?確実に違うと思いますが。 わかる方回答よろしくお願いします。

  • php ある一定期間が何ヶ月か という処理をしたい

    たとえば2004-05-06から現在までが 何ヶ月かという計算をしたいのですが、 仮に現在の日付が2008-10-08としますと phpでは日付の型がないので、仕方なく 日付を一旦秒に変換しなければならず 上記の例ですと139622400秒であるというところまではできました。 しかし、こんどはこの秒を月に変換する方法が分かりません。 2592000秒(30日間)で割れば53.8ヶ月という数字は出せましたが 31日の月や、28日しかない月があるので、 算出結果を四捨五入するとしても 果たしてこれで正確な処理ができるか不安です。 また結果はあくまで”何ヶ月”という 数字がほしくて(for等の処理に利用する為) ○年○ヶ月という値ではとりたくありません。 どうすれば、ある一定期間の月間がだせるでしょうか?

    • ベストアンサー
    • PHP
  • C#で一定時間間隔で繰り返し処理がしたい

    こんにちは。 Microsoft Visual Studio2005でC#言語を使っているのですが、 以下の処理をしたいと思っています。 button1が押されたら、numericUpDown1にて設定された秒数間隔で エンターキーを押す。 ※numericUpDownに3が設定されていたら3秒に一回エンターキーを押すということです。   さらに、button2が押されたら、その処理を止める。 2日間ほどいろいろ調べて試行錯誤しましたが、まったくわからず質問させていただきました。 実際にプログラムを書いていただけるとありがたいですが、 どういったキーワードで調べるといいなどという情報でもいいので、 お待ちしています。どうぞよろしくお願いします。

  • PHPで外部プログラムのバックグラウンド処理(Windows)

    よろしくお願いします。 PHPのバージョン4でWindowsです。 現在***.exeをsystem()で実行しています。 この***.exeの処理が長い時で、10分位かかってしまうので、バックグラウウンドで処理をしたいと考えています。 コマンドプロンプトで >start ***.exe ~ を実行したところ、うまいことバックグラウンドで処理できました。 しかし、system()で上記のコードを実行したら一瞬黒い画面が出るだけで***.exeが実行されませんでした。 なにがだめなのか全然見当もつきません… 実現できればどんな方法でもかまわないので、 次の方法も試しました。 1. a.phpでsystem(">b.php") b.phpを呼び出し b.phpでsystem(">***.exe")を実行 結果:***.exeは実行されるのですがバックグラウンドで処理されない。 2. コマンドプロンプトでIEを開いてa.phpにアクセス a.phpでjavascript window.openでb.phpをオープン b.phpでsystem(">***.exe")を実行 b.phpをwindow.closeで閉じる 処理は出来たのですが、a.phpが残ってしまう…(消せない、消し方がわからない) a.phpが消せればこの方法でもいいのですが… とにかく実現できればいいのですが… わかる方がいたら教えてくださいお願いします。

    • 締切済み
    • PHP