ギアマンのようなキューイングサーバーを使用することを推奨しますが、ギアマンが遅れたジョブをサポートしているとは思われません。ギアマンプロトコルのいずれの言及もありません。http://gearman.org/protocol/私はBeanstalkdのようなものに行くだろう。
http://kr.github.io/beanstalkd/
あなたは1つの遅延でキューに仕事を置くための責任PHPプロセス、およびキューから消費するための第二のPHPのプロセスを持っています。
beanstalkの素晴らしいライブラリクライアントはpheanstalkです。 https://github.com/pda/pheanstalkを作ってください。
簡単な使用例:
プロデューサー
$pheanstalk = new Pheanstalk('127.0.0.1');
$delay = 3; // delay in seconds
$pheanstalk
->useTube('choose_tube_name')
->put("job payload goes here\n",
PheanstalkInterface::DEFAULT_PRIORITY, // 1024 as standard
$delay,
PheanstalkInterface::DEFAULT_TTR // I think that after 60 seconds by default, if not deleted by consumer after reserving job, it is automatically released back onto the queue to be consumed by another consumer.
);
消費者
while (1) {
$job = $pheanstalk
->watch('choose_tube_name')
->ignore('default')
->reserve();
echo $job->getData();
$pheanstalk->delete($job);
}
だから、本質的に、プロデューサーは3second遅れでchoose_tube_name
チューブ/キューに仕事を置きます。 3秒後に、キューで待機しているすべての消費者が消費する準備が整います。
コンシューマーは、到着すると待っています。消費者はそれを予約し、出力をエコーしてジョブを削除します。また、whileループで処理されるため、別のジョブが処理されるまで待機します。
拡大するためには、複数の生産と複数消費者を持つことができます。ただし、上記の例の消費者は長期的なプロセスであることを覚えておく必要があります。したがって、メモリ使用量/リークを監視し、ジョブ間でオブジェクトを共有する点で注意してください。例えばあなたがwhileループの外でクラスをインスタンス化し、それをwhileループの内部で使用/変更すると、そのプロパティは他のジョブに入り込みます。
なぜタイマーごとにcronjobを使用しないのですか? –
@Victor Radu私はまだcronを知らない。この作業はcronを使用して解決できますか? – Log
'cron'サービスはここでは役に立ちません。これは、システムのある時点(1分の解像度)でコマンドを実行するために使用されます。 – axiac