Laravel 5.2队列和任务 - 不将任务推送到数据库

11

编辑2:

这是我们正在进行的步骤:

  1. 运行时间表(为每个公司创建CollectHistoricalData作业)
  2. CollectHistoricalData 应该被推送到队列中(jobs表)
  3. CollectHistoricalData 有一个函数ApiDaemon::GetCompanyWithQuery($company, $query),它从另一个类中运行,该类在其他几个地方也有引用。
  4. GetCompanyWithQuery 收集数据并将其插入数据库中。

它完全运行通过,但挂起的问题是,它不是把作业插入到 jobs 表中,而是同步地一个接一个地运行。


编辑1:

.env 文件设置使用 database QUEUE_DRIVER,甚至尝试在 config/queue.php 文件中硬编码。


我们正在一个项目中使用 Laravel 5.2。在该项目中,我们需要每小时 cURL 一个 URL 并将数据保存到数据库。一开始,我们使用 Cron Jobs 在大约一分钟内触发了数千个 cURLs,这会因负载而导致 PHP 崩溃。

我们决定转向 Laravel 的作业和队列,但没有成功。我们正在使用数据库驱动程序来处理我们的作业,并尝试了许多不同的方法将作业放入数据库中,以便我们的守护进程工作程序可以处理它们。

这是我们当前的代码,我们使用 Kernel.php $schedule 来启动它,因此我们不会在一个小时内尝试数百个请求,从而导致数万个 cURLs。

Kernel.php 时间表:

    $schedule
        ->call(function () {
            $items = DB::select('{selecting certain things to run}');
            foreach ($items as $q) {
                $this->dispatch(new CollectHistoricalData(Company::find($q->company_id), ApiQuery::find($q->query_id)));
            }
        })
        ->hourly()
        ->name('Historical Pulls')
        ->withoutOverlapping()
        ->before(function() {
            $this->startTime = Carbon::now();
        })
        ->after(function () {
            mail({mail us a report afterward});
        });

当它运行时,它会一个接一个地运行它们,而不是将它们推送到已创建的Jobs表中。

CollectHistoricalData.php:

<?php

namespace App\Jobs;

use App\Helpers\Daemons\ApiDaemon;
use App\Jobs\Job;
use App\Models\Company;
use App\Models\ApiQuery;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class CollectHistoricalData extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    protected $company, $query;


    /**
     * CollectHistoricalData constructor.
     * @param Company $company
     * @param ApiQuery $query
     */
    public function __construct(Company $company, ApiQuery $query)
    {
        $this->company = $company;
        $this->query = $query;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        mail({let us know what started and when});
        QueryDaemon::GetCompanyWithQuery($this->company, $this->query);
    }

    public function failed()
    {
        mail({mail us letting us know it failed});
    }


}
工作引用了另一个类中的函数(因为那段代码已经很庞大了),而且有大约20个这样的类,所以最简单的方法是引用该类而不是将所有20个类重新创建成Jobs。
TL;DR
我们有一个计划应该把引用另一个类中函数的工作推到作业表中,但实际上它们一个接一个地慢慢运行。是什么原因导致了这个问题?

2
你的.env文件中指定了什么QUEUE_DRIVER - jszobody
我会从最基本的开始排除故障。首先,去掉构造函数参数,在其中添加 dd('I'm inside the handle method');。还要使用 dd(config('queue.default')) 确保没有其他地方更改了它。 - jszobody
我目前没有其他想法,只能一步步排除,直到找出问题所在。 - jszobody
看到我的回答...我现在感觉...真的...真的很愚蠢... - Brian Logan
这正是我发现问题的方式。我在我的本地机器上运行它,而不是我的服务器... 它在我的本地机器上说了出来。我正在运行终端,以为自己在服务器上,但是没有... 唉... - Brian Logan
显示剩余9条评论
3个回答

16

嗯...我太蠢了....

php artisan config:clear

我没有清除配置的缓存....哇...


这对我有用。我不确定这是做了什么。有人能解释一下吗? - InnisBrendan
@grez 你的配置信息可能在生产环境中被缓存了,因此你需要清除缓存才能使更改生效。 - 4unkur

8
在 Laravel 6.x 中,编辑 /env 文件:QUEUE_CONNECTION=sync => QUEUE_CONNECTION=database,然后处理数据就可以将其插入 jobs 表。

4

As

php artisan config:clear

我的工作出了一些问题,但我通过以下方式解决了:

php artisan config:cache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接