根据以下教程(https://laravel.com/docs/5.5/scheduling),我想出了以下脚本来在我的Lumen应用程序中安排作业:
namespace App\Console;
use App\Jobs\ClearAccessLog;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
use App\Jobs\Special\DeleteCache;
use App\Jobs\Special\FetchRemoteArticles;
use App\Jobs\Special\FetchUpdateCategories;
use App\Jobs\Special\UpdateArticles;
use Illuminate\Support\Facades\Queue;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->call(function() {
Queue::bulk([
new FetchUpdateCategories,
new FetchRemoteArticles,
new UpdateArticles,
new DeleteCache
],null,'specialqueue');
})->daily();
// listen to
$schedule->job(new ClearAccessLog())->weekly();
// listen to the helpdocs queue
$schedule->command('php artisan queue:work --timeout=0 --memory=4096 --queue=specialqueue')->everyFiveMinutes();
// listen to default jobs
$schedule->command('php artisan queue:work --timeout=0 --memory=4096')->daily();
}
}
根据我服务器的文档,我只需要注册一个单独的cronjob:
crontab -e
然后添加:
* * * * * php /path-to-my-project/artisan schedule:run >> /dev/null 2>&1
无论如何,我注意到如果我执行
php artisan queue:work --timeout=0 --memory=4096 --queue=specialqueue
通过SSH继续监听,直到命令停止,因此我不确定调度程序是否每五分钟启动一个新的后台任务,而其他任务仍然在运行?
如何才能启动此命令一次?一般来说,你看到一些明显的错误(我是这个话题的新手)?
答案 0 :(得分:2)
按计划启动队列工作人员不正确。队列工作者是守护进程,如果有任何工作可以监听,如果没有,那么它将一直睡到下一个工作可用。你要做的是创建无意义的队列工作者。
您应该查看手册Laravel Queues。如果允许您安装Supervisor,请让主管控制您的队列工作人员。主管可以帮助您监控队列工作者,并且无论如何都会因为某些错误而失败,它会尝试重新启动。
否则,您应该通过ssh在后台启动队列工作程序,并从当前用户分离该进程。但是,如果发生任何故障,队列工作程序将不会自动重启。