ユーザーがいつでもイベントを追加できるようにするアプリケーションがあります。つまり、ユーザー入力によって決定される将来の特定の時間にのみ実行する必要があるコードのチャンクです。cronjobs と同様ですが、いずれの時点でも、それぞれ独自の特定の時間に処理する必要があるこれらのイベントが何千もある可能性があります。私が理解している限りでは、crontab は膨大な数の cronjobs を持つことを意図していないため、それらを処理できません。また、分単位ではなく秒単位の精度が必要です。プログラムで cronjobs を crontab に追加できることは承知していますが、繰り返しますが、私が達成しようとしていることには十分ではありません。
また、これらはリアルタイムである必要があり、ページにアクセスするたびに期限切れのアイテムがあるかどうかを単純にチェックすることでそれらを偽造することは解決策ではありません。また、期限までにアクセスされたページがない場合でも起動する必要があります。私は健全な解決策を探していくつかの調査を行ってきました.gearmanやrabbitmqなどのキューシステムについて少し読みましたが、FIFOシステムも機能しません(イベントが追加される順序は関係ありません. 1 時間で発生するイベントを追加し、10 秒でトリガーされるはずの別のイベントを追加する可能性があります)
これまでのところ、私が見つけた最善の解決策は、デーモン、つまり、起動する新しいイベントを継続的にチェックして実行するスクリプトを作成することです。PHP が悪魔であり、メモリ リークなどを引き起こすことは承知していますが、それでも、新しい独立したプロセスを生成して実行する限り、時々再起動することで、php デーモンを数週間安定して実行できることを望んでいます。 「重労働」、イベントが発生したときの実際の処理。
とにかく、明白な質問:
1) これは正気ですか?私が行方不明になるより良い方法はありますか?
2)デーモンのアイデアを実装すると仮定すると、コードは当然、どのイベントが発生するかを取得する必要があります。これがどのように見えるかの擬似コードは次のとおりです。
while 1 {
read event list and get only events that are due
if there are due events
for each event that is due
spawn a new php process and run it
delete the event entry so that it is not run twice
sleep(50ms)
}
このリストをMySQL DBに保存する場合、「SELECT * FROM eventlist where duetime >= time();」の行で何かを使用してリストをクエリできる必要があるため、これが確かに最善の方法のようです。 、デーモンが 50 ミリ秒または 100 ミリ秒ごとに SELECT を実行するのはクレイジーですか? または、私は偏執的になりすぎており、サーバーはそれをうまく処理できるはずですか? 各反復で取得されるデータの量は比較的少なく、おそらく数百行である必要がありますが、メモリの数 KB を超える量にはならないと思います。また、デーモンと MySQL サーバーは同じマシンで実行されます。
3) MySQL DB のテーブルを含め、上記のすべてを使用する場合、それを最適化するために何ができますか? テーブルをメモリに保存することを考えましたが、サーバーがクラッシュしたり再起動したりするたびにその内容が失われるのは好きではありません。私が考えることができる最も近いものは、書き込みと更新が行われる標準の InnoDB テーブルと、読み取りが実行される別の 1:1 ミラー メモリ テーブルを持つことです。トリガーを使用すると、メモリ テーブルにすべてをミラーリングさせることができるはずですが、その一方で、維持するのはお尻の痛みのように思えます (何らかの理由でテーブルが非同期になると、フバーの状況が簡単に発生する可能性があります)。