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
转储自动加载。每次我对队列作业进行任何更改时,我都必须 运行 此命令,然后仅 运行 队列工作程序。否则,我猜,更改不会反映在队列中。
我的 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
转储自动加载。每次我对队列作业进行任何更改时,我都必须 运行 此命令,然后仅 运行 队列工作程序。否则,我猜,更改不会反映在队列中。