[英]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.