Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 作业链发生“后触发事件”;“已完成”;_Php_Laravel_Laravel 5.8 - Fatal编程技术网

Php 作业链发生“后触发事件”;“已完成”;

Php 作业链发生“后触发事件”;“已完成”;,php,laravel,laravel-5.8,Php,Laravel,Laravel 5.8,下面是名为ProcessDocumentFields的侦听器。我的侦听器类实现了ShouldQueue 在本文中,我使用withChain方法启动了两个作业,如下所示: ParseFieldContent::withChain([ 新的ParseFieldRules($event->document,$fields), ])->分派($event->document,$fields); 现在,我想有条件地触发一个事件,最终触发另一个作业 问题是,两个作业(ParseFieldContent和P

下面是名为
ProcessDocumentFields
的侦听器。我的侦听器类实现了
ShouldQueue

在本文中,我使用
withChain
方法启动了两个作业,如下所示:

ParseFieldContent::withChain([
新的ParseFieldRules($event->document,$fields),
])->分派($event->document,$fields);
现在,我想有条件地触发一个事件,最终触发另一个作业

问题是,两个作业(
ParseFieldContent
ParseFieldRules
)都必须已经完成运行

#如果下面是真的,请开火
如果($event->document->stream->settings()->get('field\u routing')){
事件(新文档默认规则处理($event->documents));
}
上述事件将触发相同的两个作业,但我必须先执行一些其他检查:

#EventServiceProvider.php
DocumentDefaultRulesAsProcessed::class=>[
ProcessDocumentRouteFields::类,
],
在我的
ProcessDocumentRouteFields
中,我有:

foreach($event->routes as$route){
如果($this->assertionForOutefieldsshouldbehandled($route,$event->document)){
ParseFieldContent::withChain([
新的ParseFieldRules($event->document,$route->fields,false),
])->分派($event->document,$route->fields);
}
}
正如您在上面所看到的,我运行了两个相同的作业(
ParseFieldContent
ParseFieldRules
),但前提是某个断言为true


我的问题是:如何确保放置在
ProcessDocumentFields
中的作业首先运行,然后当触发``事件时,
ProcessDocumentRouteFields
中的作业将运行?

首先想到的是,您可以通过缓存或DB设置某种指示符,用于检查
ProcessDocumentFields
作业是否正在处理/运行

然后,在
ProcessDocumentRouteFields
中,检查作业是否仍在处理/运行

缓存方法的外观类似于:

if (cache('processing_job')) {
    return;
}

foreach ($event->routes as $route) {
        if ($this->assertIfRouteFieldsShouldBeHandled($route, $event->document)) {
            ParseFieldContent::withChain([
                new ParseFieldRules($event->document, $route->fields, false),
            ])->dispatch($event->document, $route->fields);
        }
}
请注意,缓存时,必须将其设置为有足够的时间来执行作业

cache('processing_job', true, now()->addMinutes(20));
然后,您可以在所有操作完成后删除键/值对(放置在作业脚本末尾):

在此之后,下次执行缓存检查时,缓存帮助器将返回false并处理其他作业

我希望这有帮助

Cache::forget('processing_job');