2017-11-29 20 views
0

내 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를 처음 사용합니다.

답변

0

위의 해결책은 명령 composer dumpautoload을 사용하여 dumpautoload하는 것입니다. 큐 작업을 변경 한 다음 큐 작업자 만 실행할 때마다이 명령을 실행해야합니다. 그렇지 않으면 변경 사항이 대기열에 반영되지 않는다고 생각합니다.

0

$sourceObject은 대기열로 보내면 직렬화되며 핸들 메소드 중에 직렬화됩니다. 왜 대신 ..Eloquent\Collection 개체로 매개 변수를 변경하려고 시도하고 아무 일도 일어나지 않았습니까?