2016-11-17 53 views
0

嗨我有一個關於任務計劃的問題。我有幾個控制器,我想使用Laravel任務調度對該控制器進行調用。我已將一行cronjob添加到服務器中。我在kernel.php文件中有這樣的代碼,基本上可以工作。Laravel中的Paraller任務計劃

protected function schedule(Schedule $schedule) { 
    $schedule->call('App\Http\Controllers\[email protected]')->everyMinute()->name('firstController_cronjob')->withoutOverlapping(); 
    $schedule->call('App\Http\Controllers\[email protected]')->everyMinute()->name('secondController_cronjob')->withoutOverlapping(); 
    $schedule->call('App\Http\Controllers\[email protected]')->everyMinute()->name('thirdController_cronjob')->withoutOverlapping(); 
} 

但我有一個問題。該腳本按順序運行。是否可以將Laravel控制器作爲並行計劃任務運行?

+0

與'ShouldQueue'沒有什麼關係? – Mruf

+0

我是新來的。你能解釋一下還是提供一個例子? –

回答

0

有一種方法runInBackground()沒有在Laravel文檔中提到,但列在their API

你可以把它添加到每個$schedule行:

$schedule->...->runInBackground(); 

,並看看是否有幫助。不過,我不確定它是否可以與withoutOverlapping()一起使用。我用PHP 7和IIS對Laravel 5.2進行了小測試,儘管裏面有一些Log::info(),但任何任務都沒有記錄任何內容。它也高興地讓我執行多個artisan schedule:run命令而不檢查任務是否完成。


其他可能(artisan命令)可直接使用的Symfony的Process類啓動後臺進程:

use Symfony\Component\Process\Process; 

[...] 

protected function schedule(Schedule $schedule) { 

    $schedule->call(function() { 
     return (new Process('php artisan test:test'))->start(); 
    })->everyMinute(); 
} 

在這種情況下,腳本將不檢查重疊的任務,並添加withoutOverlapping()可能還不夠 - 您寧可需要編寫自己的方法來添加/刪除互斥鎖,然後在例如任務本身。