繁体   English   中英

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分钟不断抓取这些网站。 因此,要对此进行管理,我正在尝试实现队列,我猜这将是正确的解决方案。

这是示例数据表:

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。 这是我的工作类别:

<?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

我试图找到解决方案,但所有来源都使用“电子邮件”示例。 没有任何资料解释数据库实例。

PS-我是Laravel Queue的新手。

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

解决上述问题的方法是使用命令composer dumpautoload 每当我对队列作业进行任何更改时,都必须运行此命令,然后仅运行队列工作器。 否则,我想更改不会反映在队列中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM