我对 Laravel 还很陌生,正在尝试创建队列来处理我的处理脚本。 处理脚本将由夜间 cron 作业触发。
我已经设置了 beanstalkd 并正在使用队列。 我还设置了非常简单的命令,这将允许我使用 artisan 启动脚本。我对 Laravel 还很陌生,正在尝试创建队列来处理我的处理脚本。 处理脚本将由夜间 cron 作业触发。
我已经设置了 beanstalkd 并正在使用队列。 我还设置了非常简单的命令,这将允许我使用 artisan 启动脚本。
我遇到的主要问题是我的脚本中有依赖项。 例如:
A -> B -> C
-> D
我需要脚本 A 首先成功运行,然后 B 需要成功运行,然后 C 和 D 需要运行,但 C 和 D 的顺序并不重要
每个任务都是非常不同的任务,我希望将它们分开,但需要管理队列中的依赖项。我已经创建了模型和库来处理我的处理,一切都很好。
由于我已经在模型中拥有了逻辑,因此我只需要对队列进行一次小调用。 最初我想只使用闭包并将其全部写入一个文件中,下面是一个简单的示例。
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();
});
这不起作用。 在闭包内运行闭包似乎存在问题。 还可能存在一个问题,即 jobA 可能在 jobB 启动之前就被删除了。
这个例子比我实际需要做的要简单一些。 这是一个更好的例子......完成 A 后,我现在需要获取一组事物并循环遍历每个事物并运行 B。然后从前面我说过我有 C 和 D,它们是从 B 产生的。 ..但我还没有到达 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 此时无关紧要,只要它们运行即可。 这种方法似乎有效,但我认为有时当 processA 在 ProcessB 生成之前完全完成时我会遇到问题。弄清楚这些事情花了很长的一天,也许这确实有效......需要进行更多测试。
此外,由于 Laravel 或 PHP 5.4 中的自动加载魔法,此方法要求我为正在运行的每个 ProcessA/B/C/D 创建一个单独的文件。正如您所看到的,每一个都很短。这看起来是一种相当复杂的做事方式。
- 此方法似乎有任何缺陷吗?
- 我应该以其他方式做到这一点吗?
- 我是否应该费心将其初始化为 artisan 命令并切换到路由并使用curl 调用它们?
- 有什么方法可以让嵌套闭包起作用吗?
最佳答案
我能想到的最简单的方法:当你的第一个闭包完成其工作时触发一个事件,然后在其他地方监听该事件。当你捕获它时,将下一个作业推送到队列中,等等。
关于command - 具有嵌套闭包、命令和依赖项的队列管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16825808/