Примечание. Мой вопрос не имеет ничего общего с графиком команд в Laravel, график которого не работает. Но в моем вопросе работает планирование, но он не может вызвать команду artisan.
Я использую команду larvel scheduling artisan. Я запускаю команду непосредственно с консоли, например, эту команду sudo -u www-data /var/www/market/artisan command:printer-serving 281H28
.
Я знаю, что это работает, потому что у меня есть Log::info('Working')
при вводе функции handle()
команды.
Пока я использую планирование laravel. И cron работает хорошо, для ниже Log::info('command:printer-serving 281H28');
непрерывно выводить содержимое на консоль.
Но команда artisan не выполняется, она ничего не выводит на консоль и не записывает что-то в БД
В 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(); } }
Имя команды, protected $signature = 'command:printer-serving {pid}';
Примечание. Независимо от того, какая строка даже не является командой, которую я ввел в функцию $schedule->command()
, ничего не будет изменено, а не сообщение об ошибке из журнала cron или журнала laravel.
Я хочу знать, как отлаживать функцию $schedule->command()
.
Файл Cron vi /etc/cron.minutely/printer-task-minute
#!/bin/sh cd /var/www/market sudo -u www-data ./artisan command:regen-htaccess #sudo -u www-data ./artisan schedule:run >> /dev/null 2>&1 sudo -u www-data ./artisan schedule:run
Ветранная вещь – выход в журнал четыре раза каждые 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 и обнаруживаю, что есть четыре queue:listen --queue=xxxx --env=worker_env --delay=3
в выводе команды ps aux | grep php
ps aux | grep php
. Здесь я нашел, почему вывод журнала на этой частоте, но я не знаю, почему queue:listen
выполняет функцию schedule()
как этот вопрос. Понимание очередей и планировщика на Laravel 5.2 .
Каждый раз, когда я выполнял команду 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()
. Только при выполнении команды run schedule:run
как команда artisan, так и Log::info()
в schedule()
.
Я думаю, вы должны использовать команду ниже
$schedule->command('printer_serving')->everyMinute();
Это стоит мне день, чтобы решить эту проблему, прочитать документы laravel и запустить много тестов. Наконец, я все понял.
Локальная artisan queue:listen
Laravel artisan queue:listen
команду вызывать schedule()
в Kernel.php периодически, в то время как она запускает Log::info()
в schedule()
не в команде $schedule->command()
здесь ( я тоже смущен) ).
У меня четыре очереди, для queue1 sudo -u www-data php artisan queue:work --queue=queue1 --env=worker_env --delay=3 --timeout=600
. То же самое с queue2, 3, 4. Таким образом, Log::info()
в schedule()
будет выполняться четыре раза каждые 3 секунды.
Выше мне показалось, что график работает хорошо. Фактически, расписание не выполняется. Я обнаружил, что /etc/cron.minutely/printer-task-minute
не имеет привилегий x
, поэтому я добавляю для них привилегию x
. И я обнаружил, что не создал файл crontab, поэтому добавляю * * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.minutely )
* * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.minutely )
в /etc/crontab
(я не знаком с cron).
Решение:
Конфигурируйте cron, как указано выше, или обратитесь к руководству.
Изменить queue:listen
queue:work
(при изменении на queue:work
, schedule()
не будет выполняться по очереди периодически, я также не знаю причины здесь. ).