Почему команда php artisan: schedule run не выполняет команды artisan? - PullRequest
1 голос
/ 03 апреля 2019

Я запускаю команду php artisan: schedule run, и она показывает сообщения о том, что команды выполняются.Однако ничего не происходит (события запускают команды), это не сработало, что это может быть?

Kernel.php

<?php

    namespace App\Console;

    use App\Console\Commands\CheckPayments;
    use App\Console\Commands\CheckSubscriptions;
    use App\Console\Commands\DeleteOperationalLogs;
    use App\Console\Commands\GenerateInvoices;
    use Illuminate\Console\Scheduling\Schedule;
    use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

    class Kernel extends ConsoleKernel
    {
        protected $commands = [
            CheckPayments::class,
            GenerateInvoices::class,
            CheckSubscriptions::class,
            DeleteOperationalLogs::class
        ];

        protected function schedule(Schedule $schedule)
        {
            $schedule->command(CheckPayments::class, ['--force'])->everyMinute();
            $schedule->command(GenerateInvoices::class, ['--force'])->everyMinute();
            $schedule->command(CheckSubscriptions::class, ['--force'])->everyMinute();
            $schedule->command(DeleteOperationalLogs::class, ['--force'])->everyMinute();
        }

        protected function commands()
        {
            $this->load(__DIR__.'/Commands');

            require base_path('routes/console.php');
        }
    }

После запуска php artisan schedule:

Running scheduled command: "C:\xampp\php\php.exe" "artisan" payments:check --force > "NUL" 2>&1
    Running scheduled command: "C:\xampp\php\php.exe" "artisan" subscriptions:check --force > "NUL" 2>&1
    Running scheduled command: "C:\xampp\php\php.exe" "artisan" invoices:generate --force > "NUL" 2>&1
    Running scheduled command: "C:\xampp\php\php.exe" "artisan" logs:delete --force > "NUL" 2>&1

Примечание : если я запускаю команды отдельно , это работает, например: платежи php artisan: check

1 Ответ

2 голосов
/ 04 апреля 2019

Чтобы использовать команду в своем планировщике, вы можете использовать ее подпись или имя класса. Каждая команда в App\Console\Commands имеет следующее:

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = "example:command";

После того, как команда импортирована в App\Console\Kernel.php, в массиве protected $commands = []; ее можно использовать в функции schedule(), но использование ExampleCommand::class неверно:

protected function schedule(Schedule $schedule){
  $schedule->command("example:command --force")->everyMinute();
  $schedule->command(ExampleCommand::class, ["--force"])->everyMinute();
  ...
}

Основная проблема здесь, кажется, связана с параметром --force, который выдает следующую ошибку:

Опция "- force" не существует

Многие из существующих команд Laravel имеют установленный флаг --force, который из документации делает следующее:

Принудительно запустить операцию в рабочем состоянии.

Многие команды ремесленников запрашивают ввод, когда вы запускаете команду, например php artisan migrate, которая запрашивает

Вы уверены, что хотите запустить эту команду в рабочей среде?

Поскольку планировщик неинтерактивен, флаг --force переопределит эту подсказку на «Да». При этом вам нужно определить и обработать опцию самостоятельно:

protected $signature = "example:command {--force}";

public function handle(){
  $force = $this->option("force");
  if(env("APP_ENV", "production") == "production" && !$force){
    if(!$this->ask("Are you sure you want to run this in production?")){
      return false; // or dd();, etc.
    }
  } 
}

Это не проверено, но если APP_ENV=production установлено в .env, а $force равно null (по умолчанию, если --force не включено), то оно запросит подтверждение и выйдет, если " Нет "ответил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...