どのユーザーも、必要に応じて何度でもイベントをトリガーできます。このイベントがトリガーされるたびに、タイムスタンプ、ユーザー ID、その他の有用な情報を含む行が mysql テーブルに作成されます。私がする必要があるのは、イベントがトリガーされてから正確に 12 時間後に、つまりテーブルの各行に対して実行されるスクリプトを起動することです。
自動化された効率的な方法でこれを達成するにはどうすればよいですか?
どのユーザーも、必要に応じて何度でもイベントをトリガーできます。このイベントがトリガーされるたびに、タイムスタンプ、ユーザー ID、その他の有用な情報を含む行が mysql テーブルに作成されます。私がする必要があるのは、イベントがトリガーされてから正確に 12 時間後に、つまりテーブルの各行に対して実行されるスクリプトを起動することです。
自動化された効率的な方法でこれを達成するにはどうすればよいですか?
毎分スクリプトを起動するcronジョブを使用できます。
スクリプトでは、最初に行をフェッチし、実行しても問題がないかどうかを確認し(12時間経過した場合)、続行するか、停止する必要があります。
これが非常に効率的かどうかはわかりません。データベース内のエントリ数によって異なりますが、技術的には、現在の日付がデータベースから取得した日付+12時間と一致するかどうかを確認するだけの費用はかかりません。これ以上は言えません。あなたはあなたのデータについてあまり多くの詳細を与えなかったからです。
あなたはおそらくcronjobを使った方が良いでしょう
http://en.wikipedia.org/wiki/Cron
潜在的に、MySQL イベント スケジューラを調べることができます。あなたのニーズに合わないかもしれませんが、与えられた詳細を実際に伝えるのは難しいです
http://dev.mysql.com/doc/refman/5.1/en/events.html
何かのようなもの
CREATE EVENT myTimedEvent ON SCHEDULE EVERY INTERVAL 5 minutes DO CALL updateRows();
updateRows は基準 (12 時間前) をチェックし、そうであれば、実行したいアクションを実行します。これには、MySQL が @ バージョン 5.1+ である必要がありますが、
これは、CronJobsを使用して実行できます。サーバーまたはcronjob管理を提供するサーバー管理ツールキットへのrootアクセス権がある場合は、サーバー上でそれを行います。それ以外の場合は、オンラインcronjobサービス(cronjob onlineの場合はgoogle)を使用します。
次に、cronjobは、1分ごとや5分ごとなど、定義された間隔でサーバー上でphpスクリプトをトリガーします。
次に、このスクリプトはmysqlテーブルから12時間(WHERE timestamp <= NOW() - INTERVAL 12 hour
)より古いすべての行を選択し、各結果に対して目的のアクションを実行し、テーブルから結果を削除します(または完了のマークを付けます)。
フェッチとアクション自体がcronjob間隔よりも高速であることを確認してください。そうでない場合、2つ以上のスクリプトが同じ行で動作することになります。
おそらく、1 分ごとに実行され、データベース内の 12 時間を超えてまだスクリプトが処理されていない行をチェックして処理する cron ジョブが最適です。これで正確に 12 時間の差が生じることはありませんが、その 1 分以内に差が生じます。
また、スクリプトが同時に 2 回実行されるという重複がないように、スクリプトが数秒以内に実行できることを確認することもできます。