2011-02-06 19 views
0

ユーザーがフォームを送信してから30分後に関数を呼び出す必要があります。私はjavascriptのsetTimeOut()関数を使用していましたが、それはページの更新時またはブラウザが閉じるときにタイマーをクリアします。何が(ブラウザが閉じられているかリフレッシュされているかに関係なく)30分後にこの関数を正確に呼びたい&また、残りの時間も30分に表示したいと思う。スケジュールされたジョブを実行する

私はCronジョブを見ましたが、私の理解は、PHPがcronジョブを直接呼び出すことができないということです。

これを行うにはどのような最善の方法がありますか教えてください。

+0

これは詳細によって異なります。ブラウザやサーバーで実行する必要がありますか?どれくらい正確にする必要がありますか?±1分が許容可能かどうかですか? – deceze

+0

±1でよい。私はそれをバックエンド、おそらくサーバー内で実行し続けたいと思っています。私の要件は、フォームが提出されたら、スケジューリングの中断があってはならないということです。それが実行されている限り(ブラウザまたはサーバー)は問題ありません – ptamzz

答えて

6
  1. at commandatdデーモンは、将来の任意の時点で実行されるものをスケジュールすることができ関連します。あなたはおそらくatに渡すための専門のPHPスクリプトを書く必要があります。どのユーザーがフォームを送信したかなどを知るために、追加の引数を渡すことができます。もちろん、このコードはサーバー上で実行されます。 PHPコードは結果をデータベース(または同様のグローバルデータストア)に格納します。
  2. ユーザーに残す時間を表示するには、セッションまたはデータベースに時間を格納します。サーバーの時刻はユーザーのコンピューターの時刻とは異なるため、サーバーではなく、JavaScriptで差異計算を行うことをお勧めします。
  3. setTimeout()ブラウザがページにリダイレクトされる(またはAJAXなどを介してロードされる)ことを確認して、適切なタイミングで結果を表示するためにコールを使用することもできます(イベント発生時にユーザーがサイトにいると仮定します)。セッションの時間に基づいて、すべてのページのロード時にsetTimeout()を正しい時刻に保つようにしてください。

ステップ1のPHPコードは実行に時間がかかるので、#3に小さな遅延を追加して、結果が利用可能であることと適切なエラーがあることを確認してください結果が他の理由で利用できなくなった場合には、

+0

+1私はこの方法で行くでしょう –

2

私は@wuputahメソッドに投票して、それが一番良いと同意しますが、彼(共有ホスティングなど)のステップ1にアクセスできない場合は、データベースにタイムスタンプを設定してcronジョブは1分ごとに実行され、データベースは「処理済み」フラグなしで「期限切れ」時刻をチェックし、そのデータにプロシージャを実行します(DBエントリを「処理済」とマークして実行しません)。次のサイクル)。

+---------------------------------------------+ 
| RECORD ID | TIMESTAMP   | PROCESSED | 
+---------------------------------------------+ 
| 1  | 2010-02-06 15:27:10 | yes  | 
| 2  | 2010-02-06 15:47:10 | no  | 
| 3  | 2010-02-06 15:49:10 | no  | 
+---------------------------------------------+ 
+0

これは、あなたが60秒の遅延まで許容することができる場合、これは良い選択肢です! – wuputah

関連する問題