#php #laravel #cron
Вопрос:
Я создаю проект с Laravel 7.28 на локальном хостинге. Мне нужно обновлять PDF-файл каждый час. Для начала я создал команду:
<?php
namespace AppConsoleCommands;
use AppEvent;
use IlluminateConsoleCommand;
class PDF extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'pdf:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'All Country PDFs updated';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$event = new Event();
$event->user_id = 1;
$event->save();
echo 'done';
}
}
Он просто вставляет запись в таблицу событий и отлично работает. Затем я отредактировал Kernel.php в каталоге AppКонсоль.
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
CommandsPDF::class,
];
/**
* Define the application's command schedule.
*
* @param IlluminateConsoleSchedulingSchedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('pdf:update')->everyMinute();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__ . '/Commands');
require base_path('routes/console.php');
}
}
Наконец, я бегу php artisan schedule:run
. Я ожидал, что команда выполняется каждую минуту, но она выполняется только один раз. это проблема на локальном хосте или я сделал что-то не так?
Комментарии:
1. вам нужно что-то вроде cron, чтобы запускать планировщик каждую минуту … «При использовании планировщика вам нужно только добавить следующую запись Cron на свой сервер. «Введение — Запуск планировщика
2. @lagbox возможно ли это на локальном компьютере?
3. вам понадобится что-то вроде «cron» в вашей локальной системе, чтобы каждую минуту вызывать планировщик
Ответ №1:
php artisan schedule:run
Просто запускается один раз по своему определению:
Команда
schedule:run
Artisan оценит все ваши запланированные задачи и определит, нужно ли их выполнять, исходя из текущего времени сервера.
Если вы хотите делать это каждую минуту, вам следует использовать запланированную систему управления процессом, такую как supervisor
или crontab
или и т. Д. (более подробная информация здесь)
В случае, если вы используете laravel 8.x и работаете на сервере разработки/локальном сервере, вы можете использовать следующую команду, и она будет работать для вас:
php artisan schedule:work
Комментарии:
1. Боюсь
php artisan schedule:work
, это не сработает. Это не определено. Что еще я могу сделать?2. @jigsaw075 извините, только что увидел, что вы используете Laravel 7,
schelule:work
работающий только с версией 8. Для вас, в зависимости от вашей операционной системы, вы должны использовать собственную систему управления процессами по расписанию, какcron
иsupervisor
для базовых систем unix. Для Windows существуют альтернативные решения, которые вы можете найтиAlwaysUp
.
Ответ №2:
Для Laravel 7 вы также можете использовать приведенную ниже команду для запуска в вашем локальном
while true; do php artisan schedule:run; sleep 60; done