2016-11-17 64 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()可能还不够 - 您宁可需要编写自己的方法来添加/删除互斥锁,然后在例如任务本身。