Я разрабатываю платформу для блогов с Laravel 5.6, и публикация сообщений может быть запланирована.Чтобы достичь этого, я:
- создал команду
post:publish {id}
через класс PostPublish
, помещенный в папку Console/Commands
. - На основе документации говорит, что команда загружается автоматически, потому что в
Console/Commands
, поэтому я не зарегистрировался в свойстве $commands
в Console/Kernel.php
(если я запускаю php artisan list
, post:publish
действительно будет в списке). - Всякий раз, когда пользователь планирует публикацию, сообщение вставляется в таблицу
blog_posts
, классифицированную как scheduled
, и новая таблица добавляется в таблицу tasks
(id
, command
, cron
).например, 4
, post:publish 56
, 17 11 18 9 2
. - Я добавил запись 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
- Чтобы установить 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');
}
}