Laravel «Никакие запланированные команды не готовы к запуску». [Duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

14
задан 8 June 2015 в 02:10
поделиться

8 ответов

Вы пытались запустить manuallay?

Запустить php artisan и посмотреть, зарегистрированы ли ваши команды.

Если вы зарегистрировали свои команды, вы должны увидеть command:daily-reset и command:monthly-reset в списке доступных команд мастеров.

Если вы их не видите, продолжайте и зарегистрируйтесь ваши команды, добавив его в свойство commands, доступное в app/Console/Kernel.php.

protected $commands = [
    'App\Console\Commands\YourFirstCommand',
    'App\Console\Commands\YourSecondCommand'
];

Измените запись crontab на

* * * * * php /home/privates/public_html/staging/current/artisan schedule:run

5
ответ дан chanafdo 20 August 2018 в 07:02
поделиться
  • 1
    Да, я попытался запустить обе команды вручную, и они работают нормально. Они уже добавлены в массив $commands. Все функциональные возможности работают как ожидалось - единственная проблема заключается в том, что cron не запускает их для запуска, просто отображая сообщение, указанное в моем вопросе. благодаря – user 8 June 2015 в 14:59
  • 2
    Измените запись crontab на * * * * * php /home/privates/public_html/staging/current/artisan schedule:run. – chanafdo 8 June 2015 в 15:17
  • 3
    Я менял его, чтобы работать каждую минуту, и, похоже, он работает. Кажется глупо неэффективным, чтобы каждый раз запускать его, чтобы что-то делать один раз в день, но это проблема еще на один день. Благодарю. – user 14 June 2015 в 06:14

Полный ответ на этот вопрос не указан выше, насколько я могу судить. Предположим, что наше расписание выглядит следующим образом:

protected function schedule(Schedule $schedule)
{
    $schedule
        -> command('cbh:dummyCommand')
        -> everyFiveMinutes()
        -> appendOutputTo ('/my/logs/laravel_output.log');
}

Я обнаружил, что этот код не запускает вашу работу каждые 5 минут. Это также предотвращает повторную команду, если она была запущена менее 5 минут назад.

Лучший способ подумать о том, что этот код задает именованную команду ", которая будет выполняться каждый раз минутная цифра текущего времени - 0 или 5 ". Другими словами, если я запустил аргумент командной строки: php artisan schedule:run в 11:04, тогда ответ будет:

# No scheduled commands are ready to run.

Но если я запустил ту же команду в 11:00 или 11:05, тогда мы получаем:

# Running scheduled command: php artisan cbh:dummyCommand >> /my/logs/laravel_output.log 2>&1

И я получаю вывод в своем лог-файле.

Я обнаружил выше, когда мой график everyFiveMinutes() создавал журнал мой файл каждые 10 минут на основании того, что мой планировщик задач выполнялся каждые 2 минуты.

Однако это не совсем касается вашей проблемы, учитывая, что расписание daily() (0 0 * * *) выравнивается с вашим расписанием cron-job. Единственное, что я могу себе представить, это то, что есть некоторая несогласованность с вашими часовыми поясами, как это предлагает @Octavio Herrera. Но это трудно сказать, не зная немного больше о вашей среде.

2
ответ дан cartbeforehorse 20 August 2018 в 07:02
поделиться

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

Проверьте, может ли запланированное задание работать немедленно. Вы можете использовать для этого метод exec.

<?php
...

protected function schedule (Schedule $schedule) {
    $schedule -> exec("php artisan your:command");
}

Причиной этого является то, что вы можете планировать запуск задачи в определенное время и, если это время еще не наступит, он выведет: «Никакие запланированные команды не готовы к запуску».

5
ответ дан David Lartey 20 August 2018 в 07:02
поделиться
  • 1
    Есть ли способ сделать так, чтобы он не вышел, прежде чем все запланированные задачи будут выполнены? Или есть способ проверить записи, сделанные в Kernel.php, успешно запустится, прежде чем развертывать его на производстве? – sabertooth1990 26 October 2016 в 08:17
  • 2
    @ sabertooth1990 У меня не было первой части вопроса: заставить ее выйти. Но для тестирования я всегда стараюсь клонировать свою производственную среду как можно больше локально - или, если это невозможно, в промежуточной среде - поэтому у меня также есть cron, выполняющий расписания локально. – David Lartey 26 October 2016 в 09:49
  • 3
    когда я запускаю php artisan your:command с консоли, он работает. но когда я помещаю что-то вроде графика защищенных функций (Schedule $ schedule) {$ schedule- & gt; command ('my: command') - & gt; dailyAt ('13: 40 ') - & gt; withoutOverlapping (); } он не получает запланированных и выполненных, даже если я жду целый день. – sabertooth1990 26 October 2016 в 10:24
  • 4
    Вы можете проверить, запущен ли cron, который запускает artisan schedule:run? Перечислите все активные клоны, используя: crontab -l, если он не является частью списка - обратите внимание на / path / to / artisan - добавьте следующую строку в ваш crontab -e * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1 – David Lartey 26 October 2016 в 10:29

Я понял, что проблема в форме меня была методом

->withoutOverlapping() 

. Как только я удалил этот метод, мои команды начали работать и были найдены процессом daemon.

Я думаю, что может быть ошибка в методе, но мой проект на данный момент может немного накладываться, так что это круто.

6
ответ дан Moses Ndeda 20 August 2018 в 07:02
поделиться
  • 1
    Этот ответ дает понять, почему withoutOverlapping не может работать в вашем случае. У меня была аналогичная проблема, но я хотел сохранить наложенную проверку на месте. В моем случае возникла проблема с перезагрузкой экземпляра. – Gustavo Straube 7 March 2018 в 11:57
  • 2
    Еще одна мысль: у меня не было файла расписания в директории storage/framework. Однако запуск php artisan cache:clear сделал трюк. – Gustavo Straube 7 March 2018 в 12:06
  • 3
    Для меня это было проблемой. Флаг, установленный withoutOverlapping, истекает через 24 часа (!) По умолчанию. В моем случае было бы гораздо разумнее использовать его, как ->withoutOverlapping(5), в котором говорится, что флаг должен истечь через 5 минут. – AlbinoDrought 9 May 2018 в 17:05

Я думаю, что мой блог поможет вам ответить на ваш вопрос. Пожалуйста, см. Ниже или ссылку: Laravel Crontab Во многих проектах вам нужно использовать crontab (задания cron) для выполнения некоторых задач по отправке электронной почты или удалению записей отходов в БД. С помощью Laravel Project вы можете сделать это легче.

Будьте достаточно сильными, чтобы отпустить и достаточно терпеливы, чтобы дождаться того, чего заслуживаете. Будьте достаточно сильными, чтобы отпустить и достаточно терпеливы, чтобы дождаться того, чего вы заслуживаете

Создайте команду в Laravel 4:

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class FirstCommand extends Command {

        /**
         * The console command name.
         *
         * @var string
         */
        protected $name = 'user:active';

        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description.';

        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
                parent::__construct();
        }

        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function fire()
        {
                echo "User Actived";
        }
        /**
         * Get the console command arguments.
         *
         * @return array
         */
        protected function getArguments()
        {
                return array(
                );
        }

        /**
         * Get the console command options.
         *
         * @return array
         */
        protected function getOptions()
        {
                return array(
                        array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
                );
        }

}

. Следующим шагом вам нужно зарегистрировать команду с CLAR Laravel. Так просто, вы открываете файл app / start / artisan.php и добавляете одну строку, как показано ниже:

Artisan::add(new FirstCommand);

Вы закончили создание команды Laravel. Чтобы проверить, вы можете использовать следующую команду:

$ php artisan user:active

Пользователь активен Вывод выше означает, что вы успешно зарегистрируете команду.

Наконец, введите свою команду в crontab:

crontab -e

Добавить строку (запустить команду каждые 2 минуты):

*/2 * * * * php path_to_laravel_project/artisan user:active

Вот и все. Спасибо, что поговорили, чтобы прочитать это.

1
ответ дан Nguyen Sy Thanh Son 20 August 2018 в 07:02
поделиться
  • 1
    Спасибо за информацию. Очень признателен :) – user 14 June 2015 в 06:16

Плановые запланированные команды Laravel основаны на часовом поясе, настроенном в вашем файле app / config / app.php (laravel 5.1):

/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

'timezone' => 'America/Bogota',

Итак, если вы создаете команду и регистрируете ее для запуска в качестве запланированной задачи с:

$schedule->command('command:daily-reset')->daily();

он будет запускаться каждый день в 00:00 УКАЗАННОГО ВРЕМЕНИ (в данном случае Америка / Богота)

То же самое применяется если вы укажете время выполнения задачи:

$schedule->command('command:daily-reset')->daily()->at('02:30');

Это будет выполняться в 02:30 утра по местному времени в Америке / Боготе.

5
ответ дан Octavio Herrera 20 August 2018 в 07:02
поделиться
  • 1
    По вашему последнему фрагменту кода, я считаю, что он не цепной, а скорее один метод, dailyAt () – Watercayman 17 August 2016 в 06:23

Когда вы запускаете

php artisan schedule:run

на сервере, где хранится ваш проект, вы можете видеть все ваши команды, запущенные с выходом, выглядящими так:

"Running scheduled command: '/usr/local/bin/php' 'artisan' cache:update > '/dev/null' 2>&1 &"

, но только если текущее время является точным, для которого запланирована команда. В противном случае вы увидите этот вывод:

"No scheduled commands are ready to run."

Например, если вы планируете команду каждые пять минут и запустите команду в 09:07 часов, вы увидите, что нет запланированных команды, но если вы запустите его в 09:10, вы увидите, что ваша команда запущена.

Таким образом, вы можете просто планировать свою команду для запуска каждые 5 минут только для целей отладки:

$schedule->command('command:daily-reset')->everyFiveMinutes();

, а затем наблюдать, есть ли какая-либо ошибка во время работы и в конечном итоге исправить ее. По мне проблема заключалась в том, что я не установил GuzzleHttp (стыд), поэтому исправление просто запускало это в терминале:

composer require guzzlehttp/guzzle
7
ответ дан tsveti_iko 20 August 2018 в 07:02
поделиться
  • 1
    Спасибо тебе за это! Я запускаю свои скрипты cron на Rackspace / LiquidWeb, и они печально известны за несколько минут позже. Мой планировщик был установлен в everyTenMinutes(), но поскольку RS выполнял скрипты через две-три минуты после точной отметки в десять минут, задачи планировщика не выполнялись. Мое решение состояло в том, чтобы использовать everyMinute(), поскольку эта частота для меня в порядке. – Soulriser 21 March 2018 в 14:56

В Windows я исправил эту проблему, установив Запланированную задачу для запуска каждую минуту (хотя я хотел только запускать команду один раз в день), в противном случае я всегда получал сообщение No scheduled commands are ready to run..

0
ответ дан voidstate 20 August 2018 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: