私は Laravel を初めて使用し、処理スクリプトを処理するキューを作成しようとしています。処理スクリプトは、夜間の cron ジョブによってトリガーされます。
私はすでにbeanstalkdをセットアップしてキューを操作しています。また、artisan を使用してスクリプトを開始できる非常に単純なコマンドを設定しています。私は Laravel を初めて使用し、処理スクリプトを処理するためのキューを作成しようとしています。処理スクリプトは、夜間の cron ジョブによってトリガーされます。
私はすでにbeanstalkdをセットアップしてキューを操作しています。また、artisan を使用してスクリプトを開始できるようにする非常に単純なコマンドをセットアップしました。
私が抱えている主な問題は、スクリプトに依存関係があることです。例えば:
A -> B -> C
-> D
最初にスクリプト A を正常に実行する必要があり、次に B を正常に実行する必要があり、次に C と D を実行する必要がありますが、C と D の順序は重要ではありません
これらはそれぞれ非常に異なるタスクであり、個別に維持したいのですが、キュー内の依存関係を管理する必要があります。処理を処理するために作成されたモデルとライブラリが既にありますが、すべてうまく機能しています。
モデルには既にロジックがあるので、必要なのはキューの小さな呼び出しだけです。最初は、クロージャを使用してすべてを 1 つのファイルに書きたかっただけです。簡単な例を以下に示します。
Queue::push(function($jobA) use ($id)
{
ProcessA::doStuff($id);
$jobA->delete();
});
それは機能しますが、これは A のためだけのものです。B、C、D を追加する必要があります。そこで、その中にクロージャを追加することにしました。
Queue::push(function($jobA) use ($id)
{
$statusA = ProcessA::doStuff($id);
if($statusA)
{
Queue::push(function($jobB) use ($id)
{
ProcessB::doStuff($id);
$jobB->delete();
});
}
$jobA->delete();
});
これは動作しません。クロージャ内でクロージャを実行すると問題が発生するようです。また、ジョブ B が開始される前にジョブ A が削除される可能性があるという問題もあります。
その例は、私が実際に行う必要があるものよりも少し単純化されています。より良い例を次に示します... A の完了後、一連のものを取得し、それらのそれぞれをループして B を実行する必要があります。次に、前に、B から生成された C と D があると言いました。 ..しかし、これはすでに複雑になっているため、CとDの部分にはまだ到達していません。
Queue::push(function($jobA) use ($id)
{
$statusA = ProcessA::doStuff($id);
if($statusA)
{
$things = getThings($id);
foreach($things as $thing)
{
Queue::push(function($jobB) use ($thing)
{
ProcessB::doStuff($thing);
$jobB->delete();
});
}
}
$jobA->delete();
});
そのため、ネストされたクロージャーはまだ機能しません。私の次のステップは、クロージャーをネストするのではなく、代わりにクラスを作成することでした。Aプロセスを開始するには、私がしなければならないでしょう
Queue::push('ProcessA', array('id' => $id));
それで
class ProcessA {
public function fire($job, $data)
{
$things = getThings($data['id']);
foreach($things as $thing)
{
Queue::push('ProcessB', array('thing' => $thing));
}
$job->delete();
}
}
それで
class ProcessB {
public function fire($job, $thing)
{
Queue::push('ProcessC', array('id' => $thing['id']));
Queue::push('ProcessD', array('id' => $thing['id']));
}
$job->delete();
}
ProcessC と ProcessD は、実行される限り、この時点では関係ありません。この方法は機能しているようですが、ProcessB が生成される前に processA が完全に終了する場合に問題が発生していたと思います。これらのことを理解するのは長い一日でした。おそらくこれはうまくいくでしょう...もう少しテストする必要があります.
また、この方法では、Laravel または PHP 5.4 のオートローディング マジックにより、実行中の ProcessA/B/C/DI ごとに個別のファイルを作成する必要があります。ご覧のとおり、これらはそれぞれかなり短いです。これはかなり複雑な方法のように思えます。
- この方法は何らかの点で欠陥があるように見えますか?
- 他の方法でこれを行う必要がありますか?
- これを職人のコマンドとして初期化し、代わりにルートに切り替えてcurlで呼び出す必要がありますか?
- ネストされたクロージャーを機能させる方法はありますか?