Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 15.02.2017 09:25:49

Не выполняются Cron задания в Kernel.php

Версия Laravel: 5.2.4
Версия PHP: PHP 7.0
Операционная система и её версия: Centos 7
Вендор и версия сервера БД: MariaDB
Вендор и версия Веб-сервера: Nginx
Медод подключения PHP: PHP-FPM

Задача, что должно происходить _в целом_, техническое задание:
Каждую минуту должно выполнятся CRON-задание по удалению не подтвержденных пользователей из БД.
Что произошло, текст ошибки, если есть:
При запуске вручную: php artisan schedule:run выдает ошибку:
No scheduled commands are ready to run.

В crontab указано:
* * * * * root /usr/bin/php /home/artisan schedule:run 1>> /dev/null 2>&1
Ошибок в /var/log/cron нет, команда выполняется

При выполнении команды вручную php artisan cron:exec пользователи удаляются.
Пробовал указывать call() вызов прямо в Kernel.php - тоже не выполняется.
Как настроить cron?


Код:

app\Console\Kernel.php

namespace App\Console;
use DB;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        Commands\Cron::class
    ];

    protected function schedule(Schedule $schedule)
    {
		$schedule->command('cron:exec')->everyMinute();
    }
}

app\Console\Commands\Cron.php:

namespace App\Console\Commands;

use Illuminate\Console\Command;
use DB;

class Cron extends Command
{
    protected $signature = 'cron:exec';
    protected $name = 'cron:command';

    protected $description = 'Command description';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
		  DB::table('confirm_users')
		  ->whereRaw(DB::raw('created_at < now() - interval 1 day'))
		  ->delete();
    }
}

Не в сети

#2 16.02.2017 05:52:48

Re: Не выполняются Cron задания в Kernel.php

В crontab указано:
* * * * * root /usr/bin/php /home/artisan schedule:run 1>> /dev/null 2>&1

в этой фразе столько неправильного, что я даже не знаю с чего начать )

во-первых, запускать артизан от рута? а веб-сервер и сам сайт тоже от рута работают?
во-вторых, совать запуск в /etc/crontab? его вообще обычно не трогают – всё кладётся в пользовательские кронтабы, см. crontab -e – системные вещи в кронтаб рута, команды проекта – в кронтаб пользователя, от которого он запускается
в-третьих, я не понял, проект что, развёрнут прямо в /home что ли? это вообще бред какой-то

Не в сети

#3 16.02.2017 09:28:13

Re: Не выполняются Cron задания в Kernel.php

Во-первых, так как крон не работает, я перепробовал все варианты запуска, в том числе и от рута.
Во-вторых, какая разница на данном этапе откуда идет запуск
В-третьих, в home папка с доменом, я ее подтер из пути, чтобы не выкладывать в общий доступ.
В-четвертых, как ваш комментарий может мне помочь?

Не в сети

#4 16.02.2017 12:41:54

Re: Не выполняются Cron задания в Kernel.php

ну ладно, хотел запутать – получилось. откуда запускаются крон-задачи имеет значение потому что из правильного пользовательского кронтаба они всегда запускаются с правильными правами и правильным окружением. это как минимум

что пишет вывод php artisan schedule:run с ком. строки?

Не в сети

#5 16.02.2017 13:38:42

Re: Не выполняются Cron задания в Kernel.php

constb пишет:

что пишет вывод php artisan schedule:run с ком. строки?

Larapost пишет:

При запуске вручную: php artisan schedule:run выдает ошибку:
No scheduled commands are ready to run.

Задача Cron запускается и выполняется, проверял. Если в Kernel указать, следующий код, то cron его выполняет:

namespace App\Console;
use DB;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
   
    protected $commands = [
       
    ];

    protected function schedule(Schedule $schedule)
    {
		
		  DB::table('confirm_users')
		  ->whereRaw(DB::raw('created_at < now() - interval 1 day'))
		  ->delete();
    }
}

Но это выполняется каждую минуту по запуску крон задания на сервере. Если заключить код в call(...) он уже не работает:

namespace App\Console;
use DB;use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        //Commands\Cron::class,
        'App\Console\Commands\Cron',
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
		  DB::table('confirm_users')
		  ->whereRaw(DB::raw('created_at < now() - interval 1 day'))
		  ->delete();
		})->everyMinute();	
				
    }
}

Короче вроде все выполнено по мануалу и примеру там, но отказывается работать.
Были еще идеи, что надо Ларавэл обновлять до 5.3 минимум, но не может же быть такого чтобы в предыдущих версиях не работали примеры из документации...

Не в сети

#6 16.02.2017 14:50:16

Re: Не выполняются Cron задания в Kernel.php

мне кажется ошибка где-то в другом месте. давай добавим в артизан команду schedule:list

<?php namespace App\Console\Commands;

use Cron\CronExpression;
use Illuminate\Console\Command;
use Illuminate\Console\Scheduling\Schedule;

class ScheduleListCommand extends Command {

	protected $name = 'schedule:list';

	protected $description = 'List of the scheduled commands';

	/**
	 * The schedule instance.
	 *
	 * @var \Illuminate\Console\Scheduling\Schedule
	 */

	protected $schedule;


	public function __construct(Schedule $schedule)
	{
		$this->schedule = $schedule;
		parent::__construct();
	}


	public function fire()
	{
		$events = $this->schedule->events();
		$table = [ ];
		foreach ($events as $event) {
			echo $this->prepareCommandToDisplay($event->getSummaryForDisplay()) . PHP_EOL;
			$table[] = [
				'command' => $this->prepareCommandToDisplay($event->getSummaryForDisplay()),
				'expression' => $event->getExpression(),
				'next' => $this->getCommandNextRunTime($event->getExpression())->format('H:i:s Y-m-d')
			];
		}
		$this->table([ 'command', 'expression', 'next time' ], $table);
	}


	protected function prepareCommandToDisplay($eventCommand)
	{
		return preg_replace(
			'~^' . preg_quote('/usr/bin/php5 artisan ', '~') . '(.*)' . preg_quote(' > /dev/null 2>&1 &', '~') . '$~',
			'$1',
			$eventCommand
		);
	}


	protected function getCommandNextRunTime($eventCronExpression)
	{
		return CronExpression::factory($eventCronExpression)->getNextRunDate();
	}
}

кладём в app/Console/Commands/ScheduleListCommand.php и подключаем в $commands в Console/Kernel.php. что выводит php artisan schedule:list после добавления?

Не в сети

#7 16.02.2017 14:56:10

Re: Не выполняются Cron задания в Kernel.php

так, ещё один момент

protected $signature = 'cron:exec';
    protected $name = 'cron:command';

    protected $description = 'Command description';

вот в этом по-моему то ли $name то ли $signature лишний. не помню в какой именно версии добавили $signature

ps. нашёл проект на 5.2 – да, $signature там уже есть. убери $name

Изменено constb (16.02.2017 14:57:20)

Не в сети

#8 16.02.2017 15:06:38

Re: Не выполняются Cron задания в Kernel.php

constb пишет:

что выводит php artisan schedule:list после добавления?

выводит:

$ php artisan schedule:list
+---------+------------+-----------+
| command | expression | next time |
+---------+------------+-----------+

Не в сети

#9 16.02.2017 15:09:46

Re: Не выполняются Cron задания в Kernel.php

constb пишет:

так, ещё один момент

protected $signature = 'cron:exec';
    protected $name = 'cron:command';

    protected $description = 'Command description';

вот в этом по-моему то ли $name то ли $signature лишний. не помню в какой именно версии добавили $signature

ps. нашёл проект на 5.2 – да, $signature там уже есть. убери $name

Убрал, но это ничего не меняет.  php artisan cron:exec выполняется в консоли и удаляет неподтвержденных юзеров, а через Kernel не работает

Не в сети

#10 16.02.2017 15:21:11

Re: Не выполняются Cron задания в Kernel.php

по какой-то причине задача не регистрируется на выполнение по крону. не могу назвать причину, возможно проблема вообще не в пхп-коде. я бы поставил брекпойнт на Kernel::schedule и запустил бы php artisan schedule:run под отладчиком

ps. у меня именно в таком виде команды прекрасно работают по крону в проектах на версиях ларавеля начиная с 5.0 и по 5.3, и в люмене 5.4

Изменено constb (16.02.2017 15:23:03)

Не в сети

#11 16.02.2017 15:24:58

Re: Не выполняются Cron задания в Kernel.php

Спасибо за помощь, буду разбираться, потом отпишусь, вдруг кому поможет

Не в сети

#12 18.02.2017 17:41:36

Re: Не выполняются Cron задания в Kernel.php

* * * * * php /home/artisan schedule:run ---  попбробуй так
* * * * * php /home/artisan schedule:run >> /dev/null 2>&1 -- у меня не работал на 5.4

Не в сети

#13 26.07.2017 10:26:37

Re: Не выполняются Cron задания в Kernel.php

Спасибо за помощь, буду разбираться, потом отпишусь, вдруг кому поможет

Столкнулся с такой же проблемой,

выводит:$ php artisan schedule:list
+---------+------------+-----------+
| command | expression | next time |
+---------+------------+-----------+

Решение найдено?

Не в сети

#14 10.09.2017 13:56:52

Re: Не выполняются Cron задания в Kernel.php

Была точно такая же проблема - не запускались cron задачи schedule:run

Очень много времени потратил на решение, от безысходности даже разворачивал новый дистрибутив Laravel, перенося все данные на него. Всё работало, но как только я скопировал старый routes/web.php  - задачи вновь переставли запускаться. Всё дело вот в этом вызове, который я подсмотрел в каком-то мануале и оставил как есть:

// Отключаем кэш на время разработки
Artisan::call('view:clear');

Закомментировав эту строку всё встало на свои места big_smile

Не в сети

#15 26.10.2018 14:14:51

Re: Не выполняются Cron задания в Kernel.php

подскажите пожалуйста уже несколько вариантов запуска перепробовал
выдает

                               
  [ErrorException]             
  Undefined variable: boundary 

версия 5.4

если над классками ставить например отправку письма то пускает - в классы не дает

Не в сети

#16 26.10.2018 15:24:54

Re: Не выполняются Cron задания в Kernel.php

эта проблема решена - теперь
Running scheduled command: Closure

                                                           
  [Symfony\Component\Debug\Exception\FatalThrowableError] 
  Class 'App\Task' not found

Не в сети

Подвал раздела