2015-06-27 58 views
16

我目前正在開發我個人的應用程序,是關於私人服務器(例如,我的世界服務器),並自查詢服務器需要花費一些時間,我決定實現排隊的作業立即處理的作業,但是,他們工作不正常,即使被延遲時也會立即運行,導致頁面請求出現嚴重延遲。Laravel排隊甚至延遲

這裏是我的HomeController指數()的調用作業以30秒延時更新每個服務器:

public function index() 
{ 
    $servers = Server::all(); 

    foreach($servers as $server) 
    { 
     //Job Dispatch 
     $job = (new UpdateServer($server->id))->delay(30); 
     $this->dispatch($job); 
    } 
    return view('serverlist.index', compact('servers')); 
} 

作業類更新服務器如下:

class UpdateServer extends Job implements SelfHandling, ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 
    protected $id; 

    public function __construct($id) 
    { 
     $this->id = $id; 
    } 

    public function handle(){ 
     $server = Server::findOrFail($this->id); 

     //preparing the packet 
     $test = new RAGBuffer(); 
     $test->addChar('255'); 
     $test->addChar('1'); 
     $test->addShort(1 | 8); 

     //finding the server 
     $serverGame = new RAGServer($server->server_ip); 

     //Get server info 
     $status = $serverGame->sendPacket($test); 

     $server->onlinePlayers = $status->getOnline(); 
     $server->peakPlayers = $status->getPeak(); 
     $server->maxPlayers = $status->getMax(); 

     if (!$server->save()) { 
      //error ocurred 
     } 
    } 
} 

每當HomeController的index()運行,頁面請求出現大量延遲,我在Laravel的官方網頁上跟着教程,試圖找到答案,而沒有任何答案。

那麼,我做錯了什麼?爲什麼工作不會延遲30秒,然後在我的服務器中在後臺執行此操作?先謝謝你。

另外:手柄()是做什麼是應該,它查詢服務器,發送數據包,並用正確的信息更新我的數據庫。

+2

我必須使用'調度問題()'。當我切換到'\ Queue :: later(delay,job)'事情開始工作。 – QuickDanger

回答

18

你必須設置你想在你的項目的根目錄的文件.env使用隊列驅動程序。

默認情況下,隊列司機sync這確實你所描述的到底是什麼,執行隊列立刻。

爲beanstalked或Redis的(這是我的選擇),您可以選擇這樣一些不同的隊列驅動程序。 laracasts.com上有一個關於設置beanstalked隊列的excellent freebie

要查看laravel中所有可用的隊列驅動程序選項,請查看here

這裏有一個.ENV例如

APP_ENV=local 
APP_DEBUG=true 
APP_KEY=SomeRandomString 

DB_HOST=localhost 
DB_DATABASE=homestead 
DB_USERNAME=homestead 
DB_PASSWORD=secret 

CACHE_DRIVER=file 
SESSION_DRIVER=file 
QUEUE_DRIVER=sync  //< put the desired driver here 

MAIL_DRIVER=smtp 
MAIL_HOST=mailtrap.io 
MAIL_PORT=2525 
MAIL_USERNAME=null 
MAIL_PASSWORD=null 
MAIL_ENCRYPTION=null 
+0

感謝您的回答,我想我會嘗試beanstalked隊列,那麼,從我的理解來看,它的工作原理就像後臺進程一樣嗎?它不會影響頁面或任何東西的加載時間? –

+0

不應該有任何影響(除了帶寬,如果你是下載或上傳你的腳本的東西,但這應該不成問題)。 Beanstalked是一個不錯的選擇,如果你按照視頻,它會在幾分鐘內設置。 – baao

+0

太糟糕了,我沒有在laracasts帳戶,因爲它是必要的,將嘗試按照其他教程,將您的問題標記爲接受,只要我得到這個工作,謝謝你的時間! –

1

本地測試你可以在驅動器設置爲

QUEUE_DRIVER=database 

和運行PHP工匠隊列:表 然後PHP工匠遷移所以你會得到你的隊列保存到數據庫,所以你可以在視覺上本身什麼`怎麼回事..

並運行你的隊列簡單運行php artisan queue:listen ..並把它作爲運行您工匠做服務

2

有人誰取得了上述改動,仍然沒有工作,檢查這樣的隊列文件的默認值:dd(Config::get('queue.default'))

對我來說沒」 T改變,直到刷新緩存配置:

php artisan config:clear 
+0

對於本地開發重新啓動工匠服務器應該做的伎倆(我經常忘記) –

1

確保

'default' => env('QUEUE_DRIVER', 'database'), 
在配置/ queue.php

QUEUE_DRIVER=database 

在.ENV文件,以確保數據庫驅動程序用於