Laravel - 如何一次将单个数据库实例传递给队列作业进行处理?

Laravel - How to pass a single database instance at a time to the queue job for processing?

我的 MySQL 数据库中有一个网站列表。我需要使用 PHP file_get_html 方法(由 Simple HTML DOM parser 提供)来抓取这些网站。当我尝试解析每个网站时,会花费大量时间并且超出了执行时间限制。而且我需要每 30 分钟继续抓取这些网站。因此,为了解决这个问题,我正在尝试实施队列,我想这将是正确的解决方案。

这是样本数据table:

Id | Website Name |  Website Source
1  | Website 1    |  www.website1.com
2  | Website 2    |  www.website2.com
3  | Website 3    |  www.website3.com
4  | Website 4    |  www.website4.com

但是,当我尝试将数据库实例发送到队列时遇到问题。这是我的控制器功能:

 public function queueAllLinks(){
        include('simplehtmldom_1_5/simple_html_dom.php');
        
            $sourceObj = SourceDetails::all();
        
            foreach($sourceObj as $sourceObj) {    
            
                CrawlLinks::dispatch($sourceObj);
        }
    }

我正在派遣工作 CrawlLinks。这是我的工作class:

<?php

namespace App\Jobs;
use App\SourceDetails;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class CrawlLinks implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct()
    {
        
    }

    public function handle(SourceDetails $sourceObj) {
        $source_url = $sourceObj->website_source;
        $source_name = $sourceObj->website_name;
        $source_id = $sourceObj->id;
        $html = file_get_html($source_url);

        //process and save data in code    
        
    }
}

但这似乎不起作用。我收到以下错误:

local.ERROR: Type error: Argument 1 passed to App\Jobs\CrawlLinks::__construct() must be an instance of App\SourceDetails, instance of Illuminate\Database\Eloquent\Collection given, called in D:\Projects\marathinews\vendor\laravel\framework\src\Illuminate\Foundation\Bus\Dispatchable.php on line 14

我试图找到解决方案,但所有来源都使用 'email' 示例。 None 的来源解释了数据库实例。

PS - 我是 Laravel 队列的新手。

您的 $sourceObject 在发送到队列时正在序列化,并在 handle 方法期间反序列化。为什么不尝试将参数更改为 ..Eloquent\Collection 对象而不是 App\SourceDetails 并查看是否发生任何情况?

上述问题的解决方案是使用命令 composer dumpautoload 转储自动加载。每次我对队列作业进行任何更改时,我都必须 运行 此命令,然后仅 运行 队列工作程序。否则,我猜,更改不会反映在队列中。