私は自分のMySQLデータベースにウェブサイトのリストを持っています。 PHP file_get_html
メソッド(Simple HTML DOM parserで提供)を使用してこれらのWebサイトをクロールする必要があります。私が各ウェブサイトを解析しようとすると、膨大な時間がかかり、実行時間制限を超えてしまいます。 30分ごとにこれらのウェブサイトをクロールし続ける必要があります。だから、これを管理するために、私は適切な解決策であると思う実装キューを試しています。Laravel - 一度に1つのデータベースインスタンスをキュージョブに渡して処理する方法
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);
}
}
私はジョブクロールリンクにディスパッチしています。これは私の職業分類です。
<?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 Queuesの新機能です。