2016-11-17 2 views
0

こんにちは私はタスクスケジューリングに関する質問があります。私はいくつかのコントローラを持っており、Laravelのタスクスケジューリングを使ってそのコントローラを呼びたいと思っています。私はcronjobの1行をサーバに追加しました。私はkernel.phpファイルにこのようなコードを持っています。これは基本的に動作します。Laravelでのパララータスクのスケジューリング

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(); 
} 

しかし、私には1つの問題があります。このスクリプトは順番に実行されます。 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()月を追加しません。十分ではありません。むしろ、mutexの追加/削除のための独自のメソッドを作成して、それを実行する必要があります。タスクそのもの。

関連する問題