Php laravel无法运行调度命令,而queue:listen定期运行调度()
注意:我的问题与哪个时间表不起作用无关。但在我的问题中,调度工作正常,但它不能调用artisan命令。 我使用laravel调度artisan命令。我直接从控制台运行命令,如下所示Php laravel无法运行调度命令,而queue:listen定期运行调度(),php,laravel,command,scheduled-tasks,laravel-artisan,Php,Laravel,Command,Scheduled Tasks,Laravel Artisan,注意:我的问题与哪个时间表不起作用无关。但在我的问题中,调度工作正常,但它不能调用artisan命令。 我使用laravel调度artisan命令。我直接从控制台运行命令,如下所示sudo-u www-data/var/www/market/artisan command:printer service 281H28 我知道它是有效的,因为我在命令的handle()函数的输入处使用了Log::info('Working') 而当我使用拉威尔的时间表时。cron运行良好,如下所示Log::info
sudo-u www-data/var/www/market/artisan command:printer service 281H28
我知道它是有效的,因为我在命令的handle()
函数的输入处使用了Log::info('Working')
而当我使用拉威尔的时间表时。cron运行良好,如下所示Log::info('command:printer service 281H28')代码>将内容连续输出到控制台
但是artisan命令没有执行,它没有向控制台输出任何内容,也没有向DB写入任何内容
在Kernel.php中
<?php namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Log;
class Kernel extends ConsoleKernel {
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
'App\Console\Commands\Inspire',
'App\Console\Commands\CommandPrinterServing',
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('inspire')->hourly();
Log::info('command:printer-serving 281H28');
$schedule->command('command:printer-serving --force 281H28')->everyMinute();
//$schedule->command('printer-serving')->everyMinute();
//$schedule->command(CommandPrinterServing::class, ['281H28'])->everyMinute();
}
}
最奇怪的是每3秒记录四次输出
> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28
> [2017-11-29 16:52:24] worker_env.INFO: command:printer-serving 281H28
我对日志频率感到困惑,所以我停止了cron和beanstalkd。但是日志输出并没有停止。即使我停止apache2,日志保持输出。然后我检查php进程,发现在命令ps aux | grep php
的输出中有四个queue:listen--queue=xxxx--env=worker_env--delay=3
。在这里,我找到了为什么日志输出的频率是这个频率,但我不知道为什么queue:listen
执行schedule()
函数作为这个问题
每次我执行artisan命令时,sudo-u www-data/var/www/market/artisan xxxxx
将调用一次schedule()
函数。如果命令是queue:listen
类似sudo-u www-data/var/www/market/artisan queue:listen xxxxx
则将定期调用schedule()
函数。但是schedule()
中的命令将不会运行,除非Log::info()
。只有在运行schedule:run
命令时,才会执行schedule()
中的artisan命令和Log::info()
。我认为您应该使用以下命令
$schedule->command('printer_serving')->everyMinute();
我花了一天的时间来搜索这个问题,阅读laravel文档,并运行许多测试。我终于明白了
Laravel的artisan队列:listen
命令定期调用Kernel.php中的schedule()
,而它只运行schedule()
中的Log::info()
,而不是$schedule->command()
(这里我也很困惑)
我有四个队列正在运行,分别是queue1sudo-u www-data-php-artisan-queue:work--queue=queue1--env=worker\u env--delay=3--timeout=600
。与队列2、3、4相同。因此schedule()
中的Log::info()
将每3秒执行四次
上面的内容让我觉得日程安排很好。实际上,该计划没有执行。我发现/etc/cron.minutely/printer task minute
没有x
特权,所以我为它添加了x
特权。我发现我没有配置crontab文件,所以我添加了***root test-x/usr/sbin/anacron | | |(cd/&&runparts--report/etc/cron.minutely)
到/etc/crontab
(我不熟悉cron)
解决方案:
如上文所述配置cron,或参考手册。
将queue:listen
更改为queue:work
(当更改为queue:work
时,schedule()
将不会由队列定期执行,我也不知道这里的原因。)。是否可以创建另一个执行相同任务但字词之间没有空格的命令我已经修改了该命令,并在命令中使用默认参数。然后使用$schedule->command('command:printer_serving')->everyMinute()代码>,但它也不起作用。它是否直接起作用,像php artisan printer_serving可能重复而不是$schedule->command('command:printer serving--force 281H28')->everyMinute()代码>尝试:$schedule->exec('sudo-u www-data-p password/var/www/market/artisan command:printer_serving 281H28')->everyMinute()代码>这不适合我。由于命令名为'command:printer service{pid}
,我需要从控制台运行sudo-u www-data/var/www/market/artisan命令:printer\u service 281H28
$schedule->command('printer_serving')->everyMinute();