Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Версия 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();
}
}
Не в сети
В crontab указано:
* * * * * root /usr/bin/php /home/artisan schedule:run 1>> /dev/null 2>&1
в этой фразе столько неправильного, что я даже не знаю с чего начать )
во-первых, запускать артизан от рута? а веб-сервер и сам сайт тоже от рута работают?
во-вторых, совать запуск в /etc/crontab? его вообще обычно не трогают – всё кладётся в пользовательские кронтабы, см. crontab -e – системные вещи в кронтаб рута, команды проекта – в кронтаб пользователя, от которого он запускается
в-третьих, я не понял, проект что, развёрнут прямо в /home что ли? это вообще бред какой-то
Не в сети
Во-первых, так как крон не работает, я перепробовал все варианты запуска, в том числе и от рута.
Во-вторых, какая разница на данном этапе откуда идет запуск
В-третьих, в home папка с доменом, я ее подтер из пути, чтобы не выкладывать в общий доступ.
В-четвертых, как ваш комментарий может мне помочь?
Не в сети
ну ладно, хотел запутать – получилось. откуда запускаются крон-задачи имеет значение потому что из правильного пользовательского кронтаба они всегда запускаются с правильными правами и правильным окружением. это как минимум
что пишет вывод php artisan schedule:run с ком. строки?
Не в сети
что пишет вывод php artisan schedule:run с ком. строки?
При запуске вручную: 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 минимум, но не может же быть такого чтобы в предыдущих версиях не работали примеры из документации...
Не в сети
мне кажется ошибка где-то в другом месте. давай добавим в артизан команду 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 после добавления?
Не в сети
так, ещё один момент
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)
Не в сети
что выводит php artisan schedule:list после добавления?
выводит:
$ php artisan schedule:list
+---------+------------+-----------+
| command | expression | next time |
+---------+------------+-----------+
Не в сети
так, ещё один момент
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 не работает
Не в сети
по какой-то причине задача не регистрируется на выполнение по крону. не могу назвать причину, возможно проблема вообще не в пхп-коде. я бы поставил брекпойнт на Kernel::schedule и запустил бы php artisan schedule:run под отладчиком
ps. у меня именно в таком виде команды прекрасно работают по крону в проектах на версиях ларавеля начиная с 5.0 и по 5.3, и в люмене 5.4
Изменено constb (16.02.2017 15:23:03)
Не в сети
Спасибо за помощь, буду разбираться, потом отпишусь, вдруг кому поможет
Не в сети
* * * * * php /home/artisan schedule:run --- попбробуй так
* * * * * php /home/artisan schedule:run >> /dev/null 2>&1 -- у меня не работал на 5.4
Не в сети
Спасибо за помощь, буду разбираться, потом отпишусь, вдруг кому поможет
Столкнулся с такой же проблемой,
выводит:$ php artisan schedule:list
+---------+------------+-----------+
| command | expression | next time |
+---------+------------+-----------+
Решение найдено?
Не в сети
Была точно такая же проблема - не запускались cron задачи schedule:run
Очень много времени потратил на решение, от безысходности даже разворачивал новый дистрибутив Laravel, перенося все данные на него. Всё работало, но как только я скопировал старый routes/web.php - задачи вновь переставли запускаться. Всё дело вот в этом вызове, который я подсмотрел в каком-то мануале и оставил как есть:
// Отключаем кэш на время разработки
Artisan::call('view:clear');
Закомментировав эту строку всё встало на свои места
Не в сети
подскажите пожалуйста уже несколько вариантов запуска перепробовал
выдает
[ErrorException]
Undefined variable: boundary
версия 5.4
если над классками ставить например отправку письма то пускает - в классы не дает
Не в сети
эта проблема решена - теперь
Running scheduled command: Closure
[Symfony\Component\Debug\Exception\FatalThrowableError]
Class 'App\Task' not found
Не в сети
Страницы 1