Пользовательская команда Laravel и Планировщик: как узнать, где находится ошибка - PullRequest
0 голосов
/ 18 сентября 2018

Я разрабатываю платформу для блогов с Laravel 5.6, и публикация сообщений может быть запланирована.Чтобы достичь этого, я:

  1. создал команду post:publish {id} через класс PostPublish, помещенный в папку Console/Commands.
  2. На основе документации говорит, что команда загружается автоматически, потому что в Console/Commands, поэтому я не зарегистрировался в свойстве $commands в Console/Kernel.php (если я запускаю php artisan list, post:publish действительно будет в списке).
  3. Всякий раз, когда пользователь планирует публикацию, сообщение вставляется в таблицу blog_posts, классифицированную как scheduled, и новая таблица добавляется в таблицу tasks (id, command, cron).например, 4, post:publish 56, 17 11 18 9 2.
  4. Я добавил запись Cron планировщика Laravel на сервере, чтобы запускать каждую минуту, заменив >> /dev/null 2>&1 на путь файла журнала: * * * * * /opt/alt/php71/usr/bin/php /home/qs266dg7/public_html && php artisan schedule:run >> /home/qs266dg7/public_html/app/Console/cron.log
  5. Чтобы установить cronjob динамически, я решил использовать это решение на данный момент (хотя я не думаю, что оно наиболее эффективное).Итак, в методе schedule() внутри класса Kernel{} я получаю все записи таблицы tasks, для каждого из которых выполняется метод command().

Проблема : статус сообщения не меняется, как указано в методе handle() класса PostPublish, и я не знаю, как понять, в чем проблема, поскольку все выполняется автоматически на сервере.appendOutputTo() Laravel не выдал никакого вывода в cron.log, поэтому я установил >> /home/qs266dg7/public_html/app/Console/cron.log.Файл журнала теперь содержит длинный список:

Status: 404 Not Found
X-Powered-By: PHP/7.1.20
Content-type: text/html; charset=UTF-8

No input file specified.

В чем проблема?В команде?В исполнении этого?В хрон?Как я могу это знать?


app / Console / Commands / PostPublish.php

class PostPublish extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'post:publish {id}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Publish posts that have been scheduled';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $post = BlogPost::find($this->argument('id'));
        $post->status = "published";
        $post->published_at = $post->scheduled_at;
        $post->scheduled_at = null;
        return $post->save();
    }
}

приложение / Консоль / Kernel.php

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $tasks = Task::all();
        foreach ($tasks as $task) {
            $schedule->command($task->command)
                ->cron($task->cron)
                ->appendOutputTo('/home/qs266dg7/public_html/storage/app/Console/cron.log');
        }
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

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

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете проверить, создав журнал

use Log;

class PostPublish extends Command
{
/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'post:publish {id}';

/**
 * The console command description.
 *
 * @var string
 */
protected $description = 'Publish posts that have been scheduled';

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

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
     try{
            $post = BlogPost::find($this->argument('id'));
            $post->status = "published";
            $post->published_at = $post->scheduled_at;
            $post->scheduled_at = null;
            return $post->save();

        }
        catch (Exception $e) {
            Log::alert($e);
        }
}

}

Вы можете проверить свой лог в этом файле

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