2017-11-29 14 views
0

私は自分の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の新機能です。

答えて

0

上記の問題の解決策は、コマンドcomposer dumpautoloadを使用してdumpautoloadすることでした。キュージョブを変更した後にキューワーカーのみを実行するたびに、このコマンドを実行する必要があります。それ以外の場合、変更はキューに反映されません。

0

$sourceObjectは、キューに送信されるとシリアル化され、ハンドルメソッド中に直列化解除されます。なぜApp\SourceDetailsの代わりに..Eloquent\Collectionオブジェクトにパラメータを変更しようとしていますか?

関連する問題