2016-06-09 27 views
2

編輯2:Laravel 5.2隊列和工作 - 不推喬布斯DB

這是我們正在經歷的步驟:

  1. 附表運行(每家公司創造CollectHistoricalData職位)
  2. CollectHistoricalData應推送到隊列(jobs表)
  3. CollectHistoricalData有一個功能ApiDaemon::GetCompanyWithQuery($company, $query)它是從一個單獨的類運行,它也引用了其他一些地方。
  4. GetCompanyWithQuery收集數據並將其插入到數據庫中。

它一直運行良好,但掛斷不是將作業插入作業表,而是一個接一個地同步運行。


編輯1:

.env文件被設置爲使用databaseQUEUE_DRIVER,我甚至嘗試硬編碼它在config/queue.php文件。


我們使用Laravel 5.2作爲項目。在這個項目中,我們需要每隔一小時輸入一個url並將數據保存到數據庫中。我們最初使用的是Cron Jobs,並且基本上在一分鐘內就釋放了數千個cURL,這會由於負載而導致PHP崩潰。

我們決定轉移到Laravel的Jobs和Queues,但沒有成功。我們爲我們的工作使用數據庫驅動程序,並嘗試了許多不同的方法將作業導入數據庫,因此我們擁有的守護程序工作人員可以處理它們。

這是我們現在的代碼,我們使用Kernel.php $schedule開始關閉,所以我們沒有數百個請求試圖發生一個小時,這導致成千上萬的cURL。

Kernel.php附表:

$schedule 
     ->call(function() { 
      $items = DB::select('{selecting certain things to run}'); 
      foreach ($items as $q) { 
       $this->dispatch(new CollectHistoricalData(Company::find($q->company_id), ApiQuery::find($q->query_id))); 
      } 
     }) 
     ->hourly() 
     ->name('Historical Pulls') 
     ->withoutOverlapping() 
     ->before(function() { 
      $this->startTime = Carbon::now(); 
     }) 
     ->after(function() { 
      mail({mail us a report afterward}); 
     }); 

當這個運行時,它坐在那裏運行他們都一個接一個,而不是將它們推到已創建的工作表。

CollectHistoricalData.php:

<?php 

namespace App\Jobs; 

use App\Helpers\Daemons\ApiDaemon; 
use App\Jobs\Job; 
use App\Models\Company; 
use App\Models\ApiQuery; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 

class CollectHistoricalData extends Job implements ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 

    protected $company, $query; 


    /** 
    * CollectHistoricalData constructor. 
    * @param Company $company 
    * @param ApiQuery $query 
    */ 
    public function __construct(Company $company, ApiQuery $query) 
    { 
     $this->company = $company; 
     $this->query = $query; 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle() 
    { 
     mail({let us know what started and when}); 
     QueryDaemon::GetCompanyWithQuery($this->company, $this->query); 
    } 

    public function failed() 
    { 
     mail({mail us letting us know it failed}); 
    } 


} 

工作是引用其他類裏面的函數(因爲代碼是一個heafty獸都在自己的),再加上有關於這些20,所以最容易引用該類,而不是將所有20個類重新創建到Jobs中。

TL; DR

我們是應該推,引用函數在其他類的工作表中的工作,而是被他們跑了一個又一個,慢慢的時間表。這是什麼造成的?

+0

什麼在你的'.env'文件中指定的'QUEUE_DRIVER'? – jszobody

+0

'QUEUE_DRIVER'在'.env'文件中被設置爲'database',另外我甚至嘗試過在'config/queue.php'文件中以這種方式進行硬編碼。 –

+0

是'Company :: find($ q-> company_id)'和'ApiQuery :: find($ q-> query_id)'做應該排隊的工作嗎?這會在你的內核中立即調用,並且只是將結果傳遞給作業類。 – jszobody

回答

4

呃......我很笨......

php artisan config:clear

我沒有明確的配置的緩存....哇...

+0

大聲笑....偉大的東西 – Maximum86