내 MySQL 데이터베이스에 웹 사이트 목록이 있습니다. PHP file_get_html
(Simple HTML DOM parser에서 제공)을 사용하여이 웹 사이트를 크롤링해야합니다. 각 웹 사이트를 구문 분석하려고하면 막대한 시간이 걸리므로 실행 시간 제한을 초과합니다. 30 분마다이 웹 사이트를 계속 크롤링해야합니다. 그래서 이것을 관리하기 위해 큐를 구현하려고합니다. 올바른 해결책이라고 생각합니다.Laravel - 처리를 위해 한 번에 하나의 데이터베이스 인스턴스를 대기열 작업으로 전달하는 방법?
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 Queues를 처음 사용합니다.