How to set up task scheduling with cron job in laravel

Введение

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

Планировщик команд Laravel позволяет вам плавно и выразительно определять расписание команд в самом Laravel. При использовании планировщика на вашем сервере требуется только одна запись Cron. Расписание ваших задач определяется в методе файла . Чтобы помочь вам начать работу, в методе определен простой пример.

Запуск Планировщика

При использовании планировщика вам нужно только добавить следующую запись Cron на свой сервер. Если вы не знаете, как добавить записи Cron на свой сервер, рассмотрите возможность использования такой службы, как Laravel Forge , которая может управлять записями Cron за вас:

Этот Cron будет вызывать планировщик команд Laravel каждую минуту. Когда выполняется команда , Laravel оценивает ваши запланированные задачи и запускает задачи, которые должны быть выполнены.

Step 5: Scheduling the Commands.

Let’s schedule a task for running the command we just built.

Our task, according to its usage, is supposed to be run once a day. So we can use the daily() method. So we need to write the following code in the app  >>  Console  >>  Kerne.php file.

We will write the code inside the schedule function. Please refer to the documentation if you want more info about task scheduling,

// Kernel.php

   /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
          $schedule->command('registered:users')
                   ->everyMinute();
    }

When using the scheduler, you only need to add the following Cron entry to your server.

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

For me, in the localhost, I will hit the following command to get users’ mail.

php artisan schedule:run

You can find more about Task Scheduling in Laravel Documentation.

Настройка Cron

Для настройки времени, даты и интервала когда нужно выполнять задание используется специальный синтаксис файла cron и специальная команда. Конечно, вы всегда можете отредактировать файл /etc/crontab, но этого делать не рекомендуется. Вместо этого, есть команда crontab:

Ее всегда желательно выполнять с опцией -e, тогда для редактирования правил будет использован ваш текстовый редактор по умолчанию. Команда открывает вам временный файл, в котором уже представлены все текущие правила cron и вы можете добавить новые. После завершения работы команды cron файл будет обработан и все правила будут добавлены в /var/spool/cron/crontabs/имя_пользователя причем добавленные процессы будут запускаться именно от того пользователя, от которого вы их добавляли.

Поэтому тут нужно быть аккуратным, и если вам нужно выполнять скрипты от рута, то и crontab нужно выполнить от рута, а не от пользователя. Это часто становится причиной проблем.

Синтаксис crontab

Как я уже говорил, время задается особым синтаксисом, давайте рассмотрим синтаксис настройки одной задачи cron:

минута час день месяц день_недели /путь/к/исполняемому/файлу

Нужно сказать, что обязательно нужно писать полный путь к команде, потому что для команд, запускаемых от имени cron переменная среды PATH будет отличаться, и сервис просто не сможет найти вашу команду. Это вторая самая распространенная причина проблем с Cron. Дата и время указываются с помощью цифр или символа ‘*’. Этот символ означает, что нужно выполнять каждый раз, если в первом поле — то каждую минуту и так далее. Ну а теперь перейдем к примерам.

Примеры настройки cron

Сначала можно посмотреть задачи cron для суперпользователя, для этого можно воспользоваться опцией -l:

Вы можете удалить все существующие задачи командой -r:

Давайте предположим, что нам нужно запускать от имени суперпользователя наш скрипт по адресу /usr/local/bin/serve. Какой-нибудь обслуживающий скрипт. Самый простой пример — запускать его каждую минуту:

Далее, усложним, будем запускать каждый час, в нулевую минуту:

Еще дальше:

Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:

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

Можно в любой день, например, 15 числа:

В первый день недели первого месяца года, 0 часов 0 минут:

Или в нулевой день недели каждого месяца:

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

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

Для того чтобы указать определенный интервал нужно использовать символ «-«, например, каждый час, с семи утра до семи вечера:

Если нужно запустить команду несколько раз, можно использовать разделитель «,». Например, запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:

Вы можете захотеть не указывать отдельно время, а просто указать интервал, с которым нужно запускать скрипт, например, раз в 10 минут. Для этого используется разделитель косая черта — «/»:

Кроме того, для некоторых часто используемых наборов были придуманы переменные, вот они:

  • @reboot — при загрузке, только один раз;
  • @yearly, @annually — раз год;
  • @monthly — раз в месяц;
  • @weekly — раз в неделю;
  • @daily, @midnight — каждый день;
  •  @hourly — каждый час.

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

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

Скрипт должен выглядеть подобным образом. Теперь вы знаете как настроить cron, осталось проверить как все работает.

Отладка работы

После того как вы настроили правила, еще хотелось бы проверить работают ли они. Для этого ждем того времени, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron, а иногда пишется в syslog. Например, у меня в crontab есть такая строка:

Она должна выполняться в 19.40 каждый день, теперь смотрим лог:

И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут же было бы выведено сообщение.

Если нужно проверить скрипт, который находится в одной из специализированных папок, то тут еще проще, просто запустите run-paths, передав ей в параметр нужную папку или даже сам скрипт:

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

Шаг 4. Тестовый запуск планировщика

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

php artisan schedule:run

После выполнения данной команды откройте лог-файл приложения, он располагается по адресу – storage/logs/laravel.php. В нем должен быть представлен отчет, похожий на этот:

 local.INFO: Cron is working fine!  

 local.INFO: Cron is working fine!  

 local.INFO: Cron is working fine!

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

* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1

или 

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Надеюсь, статья вам пригодилась. Посмотрите еще один полезный урок по авторизации через Google аккаунт в Laravel 8.

Пожалуйста, оставьте свои комментарии по текущей теме статьи. За комментарии, лайки, дизлайки, отклики, подписки огромное вам спасибо!

Наталья Кайдаавтор-переводчик статьи «Laravel 8 Cron Job Task Scheduling Tutorial»

Settings Cron Task at Crontab

Open terminal and type the command

This command will list all crons that you have added. Now to add new cron tasks, again back to terminal and type the command

It will open an interface to your terminal to register or add new tasks. So let’s add our created cron

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

  • * * * * * It indicates our task will run every minute
  • /path-to-your-project This is path of laravel application project
  • php artisan schedule:run Here we are running our cron

We hope this article helped you to learn about Laravel 8 Cron Job Task Scheduling Tutorial in a very detailed way.

If you liked this article, then please subscribe to our YouTube Channel for PHP & it’s framework, WordPress, Node Js video tutorials. You can also find us on  and .

Шаг 3. Настройка расписания планировщика

Для автоматического выполнения запланированных задач в определенное время необходимо внести соответствующие настройки в файл Kernel.php. В таблице приведены примеры настроек.

->everyMinute(); Запуск задания каждую минуту
->everyFiveMinutes(); Запуск каждые пять минут
->everyTenMinutes(); Исполнение задачи каждые 10 минут
->everyFifteenMinutes(); Запуск задачи раз в 15 минут
->everyThirtyMinutes(); Исполнение задания каждые 30 минут
->hourly(); Запуск задачи каждый час
->hourlyAt(17); Выполнение задания каждый час на 17-й минуте
->daily(); Исполнение задачи ежедневно в полночь
->dailyAt(’13:00′); Выполнение задания каждый день в 13:00
->twiceDaily(1, 13); Запуск задачи каждый день в 1:00 и в 13:00
->weekly(); Исполнение задачи раз в неделю
->weeklyOn(1, ‘8:00’); Запуск задачи каждую неделю во вторник в 8:00
->monthly(); Исполнение задачи раз в месяц
->monthlyOn(4, ’15:00′); Запуск задачи каждый месяц, 4-го числа в 15:00
->quarterly(); Запуск задания раз в квартал
->yearly(); Исполнение задачи раз в год
->timezone(‘America/New_York’); Установка временной зоны

Теперь добавим настройки в файл, расположенный по адресу

app/Console/Kernel.php:

<?php

   

namespace App\Console;

    

use Illuminate\Console\Scheduling\Schedule;

use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

    

class Kernel extends ConsoleKernel

{

    /**

     * Команды Artisan, предоставленные вашим приложением.

     *

     * @var array

     */

    protected $commands = ;

     

    /**

     * Определение расписания выполнения команд.

     *

     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule

     * @return void

     */

    protected function schedule(Schedule $schedule)

    {

        $schedule->command('demo:cron')

                 ->everyMinute();

    }

     

    /**

     * Регистрация команд приложения.

     *

     * @return void

     */

    protected function commands()

    {

        $this->load(__DIR__.'/Commands');

     

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

    }

}

Особенности выполнения php-скрипта в задании Cron

В выполняемом php-скрипте не должны использоваться переменные окружения. Например, адреса следует прописывать явно. Дело в том, что при выполнении cron-задания в php-скрипте недоступны серверные переменные (например, $_SERVER, $_GET), т.к. веб-сервер Apache не участвует в работе демона cron и не заполняет переменные окружения.

В команде необходимо указать путь к php (может отличаться для разных хостингов), например, /usr/bin/php, затем пробел и полный путь к файлу скрипта:

/usr/bin/php /home/логин/public_html/myscript.php

Пример Cron-задания для выполнения php-скрипта один раз в день (0 0 * * * — задает периодичность)

0 0 * * * /usr/bin/php /home/логин/public_html/myscript.php

Запись из файла

Для записи содержимого файла crontab из другого файла необходимо создать этот другой файл (в привычном текстовом редакторе) со всеми записями, из которых должен состоять файл crontab. Это могут быть, к примеру, следующая запись:

Созданному файлу следует присвоить подходящее имя, например сron jobs. После того, как указанный файл создан, его содержимое необходимо записать в файл crontab командой:

Содержимое файла cronjobs полностью заменит содержимое файла crontab данного пользователя. Используя этот метод, любой пользователь может редактировать свой файл crontab. Суперпользователь обладает особым правом редактировать файлы crontab остальных пользователей. Редактирование чужого файла указывается флажком -u. Например, по команде:

файл cronjobs записывается как файл crontab пользователя oleg.

Как использовать crotab

Команда crontab используется для открытия и редактирования/добавления заданий cron. Демон cron, запущенный в Linux, выполняет запланированные задания во время, определенное в crontab ( таблица cron). Основным общесистемным файлом crontab является файл /etc/crontab.

Cron по умолчанию установлен в большинстве дистрибутивов Linux. Каждый пользователь в системе Linux может управлять своими собственными заданиями cron. Каждый пользовательский cron хранится в папке /var/spool/cron/crontabs/ (может быть разным в разных дистрибутивах). Демон cron запускает как пользовательский, так и системный crontab.

Демон Cron имеет определенный путь $PATH по умолчанию, который вы можете найти в файле /etc/crontab. Если его не определить, либо используйте абсолютный путь, либо добавьте в переменную cron $PATH. Это стоит учитывать при написании заданий.

Уведомление по почте Cron по умолчанию отправляется владельцу кронтаба. Чтобы изменить это, отредактируйте переменную среды MAILTO.

Журналы Cron хранятся в системном журнале  /var/log/syslog в системах Ubuntu/Debian и в /var/log/cron в Redhat/Rocky Linux. Вы можете отфильтровать файл журнала с помощью команды grep, чтобы проверить, успешно ли выполнено задание cron или нет.

1. Редактировать/добавить задание для Crontab

Для редактирования (существующих заданий) или добавления нового cron используйте команду crontab -e. Это откроет редактор для текущего пользователя.

Чтобы отредактировать файл crontab другого пользователя, введите:

Или просто запустите команду crontab -e, войдя в систему от имени этого пользователя.

2. Список задач Cron

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

Чтобы просмотреть список всех заданий cron для указанного пользователя, введите:

3. Удалить задачу cron

Чтобы удалить все задания cron текущего пользователя, выполните следующую команду:

Примечание: Это приведет к удалению всех заданий cron без запроса подтверждения.

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

Ограничение доступа

Вы можете управлять тем, каким пользователям разрешается использовать команду , с помощью файлов и , которые хранятся в директории . Если файл существует, любой пользователь, который будет указан в нем, не будет иметь возможность менять файл crontab. Если существует, то только пользователи, указанные в нем, будут иметь возможность изменять файлы crontab. Если оба файла существуют, и пользователь указан в каждом файле, файл будет иметь приоритет над , и этот пользователь сможет изменять файл crontab.

Например, чтобы запретить доступ для всех пользователей, а затем предоставить доступ пользователю ishmael, вы можете использовать следующую последовательность команд:

Сначала мы закрываем доступ для всех пользователей, добавив в файл . Затем, добавив имя пользователя в файл , мы предоставим пользователю ishmael доступ к выполнению задач cron.

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

Однако, если существует, и user добавлен в него, но не указан в файле , вы получите следующую ошибку после запуска предыдущей команды:

По умолчанию большинство демонов cron полагает, что все пользователи имеют доступ к cron, если только не существует или .

Set Schedule Frequent with Multiple Options

As you remember, you used the everyMinute() frequency in schedule:

Having said that, there are innumerable schedules that you can assign to your cron tasks:

Schedule Frequency Details
->cron(‘* * * * *’); Run the task on a custom Cron schedule
->everyMinute(); Run the task every minute
->everyTwoMinutes(); Run the task every two minutes
->everyThreeMinutes(); Run the task every three minutes
->everyFourMinutes(); Run the task every four minutes
->everyFiveMinutes(); Run the task every five minutes
->everyTenMinutes(); Run the task every ten minutes
->everyFifteenMinutes(); Run the task every fifteen minutes
->everyThirtyMinutes(); Run the task every thirty minutes
->hourly(); Run the task every hour
->hourlyAt(17); Run the task every hour at 17 minutes past the hour
->everyTwoHours(); Run the task every two hours
->everyThreeHours(); Run the task every three hours
->everyFourHours(); Run the task every four hours
->everySixHours(); Run the task every six hours
->daily(); Run the task every day at midnight
->dailyAt(’13:00′); Run the task every day at 13:00
->twiceDaily(1, 13); Run the task daily at 1:00 & 13:00

Have a look on more task schedule frequency on Laravel.

Introduction

In the past, you may have written a cron configuration entry for each task you needed to schedule on your server. However, this can quickly become a pain because your task schedule is no longer in source control and you must SSH into your server to view your existing cron entries or add additional entries.

Laravel’s command scheduler offers a fresh approach to managing scheduled tasks on your server. The scheduler allows you to fluently and expressively define your command schedule within your Laravel application itself. When using the scheduler, only a single cron entry is needed on your server. Your task schedule is defined in the file’s method. To help you get started, a simple example is defined within the method.

cron

Планировщик задач в Linux играет незаменимую роль в автоматизации администрирования операционной системы. Роль планировщика задач выполняет демон cron (crond — в некоторых дистрибутивах). Демон cron обычно запускается . После запуска, демон cron ежеминутно просматривает свои таблицы, в которых содержатся информация о периодичности запуска команд и запускает команды, когда значения полей  минута,  час, месяц и хотя бы одно из полей число и день_недели, совпадают с текущим временем. Основной конфигурационный файл демона cron — /etc/crontab:

cron:~#cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

В /etc/crontab задания выполняются с помощью команды run-parts, которая запускает скрипты и программы из указанных каталогов (/etc/cron.hourly, /etc/cron.daily и т.д.). Каждая строка запускает из соответствующего каталога задания ежечасно, ежедневно, еженедельно и ежемесячно, соответственно строкам сверху вниз

Обратите внимание, что все команды здесь запущены от имени пользователя root. Заметьте также, что crontab может содержать присваивания значений переменным shell, которые будут установлены перед запуском команды

Так же, если необходимо запускать какие-то команды по особому расписанию (не ежечасно, ежедневно, еженедельно и ежемесячно), то таблицы заданий помещаются в каталог /etc/cron.d/.

Каждый пользователь системы имеет свой файл заданий crontab, в котором описано, в какое время и какие программы запускать от имени этого пользователя. Для редактирования файла crontab используется специальная одноименная , позволяющая не прерывать процесс cron на время редактирования. Редактировать вручную таблицы cron не рекомендуется. Файлы таблиц планировщика cron для пользователей могут храниться в следующих каталогах:

/var/spool/cron — RedHat/var/spool/cron/crontabs — debian,ubuntu/var/spool/cron/tabs — SUSE

Каждая строка планировщика имеет следующий формат:

* * * * * {пользователь} выполняемая_команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12) (можно три буквы из названия месяца,
| | |                        регистр не имеет значения от jan до dec)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)

В примере показан формат одной из строки таблицы, состоящий из 7 полей. Первые 5 полей  — это значения, задающие периодичность выполнения команды (расписание). 6-e поле присутствует только в таблицах /etc/crontab и др. расположенных в каталоге /etc/cron.d/. 7-е поле есть сама запускаемая команда. Командой может быть как простая команда, например, ls /proc >> /tmp/proc, или команда запуска написанного вами специального сценария. Со всей оставшаяся частью строки до символа перевода строки или символа %, будет выполнен вызов /bin/sh или другой оболочки, определенной в переменной SHELL в crontab. Знак процента (`%’ ) в команде (если он не экранирован обратной косой чертой (`\’ ) ) будет соответствовать символу перевода строки и все данные после первого `%’  будут посланы для команды на стандартный ввод.

Для указанных выше первых 5 полей, можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц во время, указанное другими параметрами.

Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.

Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.

Косая черта (/) используется для определения шага значений. Если после диапазона указать /<целое_число>. Например, значение минут 0-59/2, определяет, что задание будет запущено каждую вторую минуту.

Вся оставшаяся часть строки до символа перевода строки или символа %, будет выполнен вызов /bin/sh или другой оболочки, определенной в переменной SHELL в crontab Знак процента (`%’ ) в команде (если он не экранирован обратной косой чертой (`\’ ) ) будет соответствовать символу перевода строки и все данные после первого `%’  будут посланы для команды на стандартный ввод.

Starting the Laravel Scheduler

Let’s setup the Cron Jobs to run automatically without initiating manually by running the command. To start the Laravel Scheduler itself, we only need to add one Cron job which executes every minute. Go to your terminal, ssh into your server, cd into your project and run this command.

crontab -e

This will open the server Crontab file, paste the code below into the file, save and then exit.

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Do not forget to replace /path/to/artisan with the full path to the Artisan command of your Laravel Application.

One of the most important advantages of Laravel Task Scheduler is that we can focus on creating commands, writing logic and Laravel will take care of the rest. It is manageable by other co-workers because it is now tracked by version control.

Learn more about Laravel:How to create REST API with authentication using Laravel Passport.

Cron

Cron is a time-based task scheduler in Unix/Linux operating systems. It runs shell commands at a pre-specified time period. Cron uses a configuration file called crontab also known as Cron table to manage the task scheduling process.

Crontab contains all the Cron jobs related to a specific task. Cron jobs are composed of two parts, the Cron expression, and a shell command that needs to be run.

* * * * * command/to/run

In the Cron expression above (* * * * *), each field is an option for determining the task schedule frequency. These options represent minute, hour, day of the month, month and day of the week in the given order. Asterisk symbol means all possible values. So, the above command will run every minute.

The Cron job below will be executed at 6:20 on 10th of every month.

20 6 10 * * command/to/run

You can learn more about Cron job on Wikipedia. However, Laravel Cron Job Scheduling makes the whole process very easy.

Добавить скрипт PHP в крон

Для начала нам нужен SSH доступ к серверу или панель Cron у вашего хостера. Настройки крон в панели у каждого хостера свои, их разбирать нет смысла.

Разберем действия через SSH.

PHP скрипты в терминале запускаются с помощью команды

php file.php

Эту команду уже можно добавить в крон, но тут могут появиться проблемы

При сохранении сокращенной версии команды, PHP может быть не найден

Не стоит добавлять в крон команду php. Воспользуйтесь запуском whereis php и скопируйте полную версию команды, чаще всего это /usr/bin/php

Далее вместо команды php, лучше сразу всё проверять на полной версии. Например:

/usr/bin/php --version

HTTP сервер и команда из терминала могут запускать разные версии PHP

Чтобы проверить, что версия одна создайте на сервере файл с контентом:

<?php
phpinfo();

Запустите его из браузера. Увидите какую версию запускает веб сервер.

В терминале запустите команду:

php --version

Увидите версию запускаемую из терминала. Версии на сервере и из терминала должны быть одинаковые.

Если версии разные, то надо поискать команду запуска версии PHP как у веб сервера. Вам может помочь команда whereis.

Вот у нас запуск php выводит 5.6, а нам надо 7.1. Получается надо запускать /usr/local/bin/php7.1

HTTP сервер и команда из терминала могут запускать PHP с разными настройками

У разных CMS есть свои обязательные настройки. Какие настройки изменятся и как это повлияет в вашем конкретном случае — не знаю. Чтобы узнать значение настройки — используйте функцию ini_get(), чтобы в терминале указать параметр — используйте директиву -d.

Например, нам надо верно установленный часовой пояс. Контент тестового файла:

<?php
var_dump(ini_get('date.timezone'));

Запускаем без параметров, и с установленным часовым поясом:

Важно: если параметры у вас не верные и на веб сервере и в терминале — надо настраивать сам PHP, например через php.ini. Если проблема только при запуске через консоль — тогда можно использовать установку нужных параметров с помощью параметра -d

Пользователь, от которого работает веб сервер, может отличаться от текущего.

Задание в крон добавляется от того пользователя, от кого вы работаете в SSH. А вебсервер может работать от другого лица.

Создайте файл с контентом:

<?php

file_put_contents('test.txt', '');

Запустите его из браузера. Посмотрите на сервере в папке скрипта владельца файла test.txt. После этого файл test.txt удалите, запустите скрипт через консоль. Снова посмотрите владельца файла test.txt. В первом и втором случае — это должен быть один и тот же пользователь.

При запуске через терминал не установлены некоторые переменные.

Часто скрипт зависит от установки $_SERVER. В этой переменной хранится корневая папка сайта. А когда мы запускаем скрипт через консоль — никакого сайта нет. Файл мы можем хоть откуда запускать, сайт не требуется для этого.

Чтобы решить эту проблему, в начало файла добавьте определение переменной:

<?php
$_SERVER = __DIR__;

Если скрипт находится в корневой папке сайта — используйте константу __DIR__, в ней папка, которой находится запускаемый файл. Если скрипт в других папках, то можно использовать относительные пути от __DIR__:

<?php
$_SERVER = realpath(__DIR__ . '/../'); // На один уровень выше

Шаг 1 – Создайте консольную команду Artisan

Консольная команда Artisan похожа на переключатель или кнопку, которую вы можете нажимать всякий раз, когда хотите, чтобы Laravel начал выполнять определенную задачу. Вы можете “активировать переключатель” или “нажать кнопку”, чтобы начать выполнение своей задачи, и это можно сделать разными способами. Один из способов – ввести команду Artisan в командную строку вашей консоли. Другой способ – включить команду в код вашего приложения, чтобы ваша задача была выполнена в определенную дату и время.

Вот кое-что приятное. Вы можете использовать одну команду ремесленника, чтобы создать другую! Чтобы создать свою новую команду, используйте предоставленную Laravel команду Artisan make:/| . Для проекта панели мониторинга Covid-19 мне нужна была работа, которая запрашивала бы API проекта отслеживания Covid и обновляла мою базу данных. Но сначала мне нужна была команда, которая начала бы эту работу. Я решил позвонить в эту команду |/Загрузка данных приложения , поэтому я ввел в консоль следующее.

php artisan make:command LoadApiData

Затем Laravel сгенерировал следующий класс с именем Load Api Data и поместил его в папку app/Console/Commands.

<?php namespace App\Console\Commands;

use Illuminate\Console\Command;

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

    /**
     * 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 handle()
    {
        //
    }
}

Класс, созданный Laravel, не является полным. Мы заканчиваем это, заполняя подпись и описание свойств класса, а также метода handle() .

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

protected $signature = 'app:load_api_data';

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

protected $description = 'Load data from the Covid Tracking Project API';

Метод handle() вызывается при выполнении команды. Мы будем использовать эту функцию для запуска задания, которое выполняет фактическую работу, которую необходимо выполнить. В моем примере этим заданием является класс Загрузка данных Api . Как вы можете видеть, название моего класса заданий совпадает с именем моего класса команд, за исключением добавленного к нему слова “Задание”.

public function handle()
  {
    LoadApiDataJob::dispatch();
  }

Здесь показан готовый класс данных Api загрузки.

<?php namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Jobs\LoadApiDataJob;

class LoadApiData extends Command
{
  /**
   * The name and signature of the console command.
   *
   * @var string
   */
  protected $signature = 'app:load_api_data';

  /**
   * The console command description.
   *
   * @var string
   */
  protected $description = 'Load data from the Covid Tracking Project API';

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

  /**
   * Execute the console command.
   *
   * @return mixed
   */
  public function handle()
  {
    LoadApiDataJob::dispatch();
  }
}

Документация Django

Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.

Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself).

Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.

Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.

Как посмотреть задания cron

Думаю, что начать следует не с настройки, а именно как посмотреть уже настроенные задачи cron. На самом деле задачи хранятся в трёх местах:

  • База данных crontab — здесь хранятся все записи cron пользователя, которые вы настраиваете вручную;
  • /etc/crontab и /etc/cron.d/ — системные записи cron и записи cron различных пакетов;
  • /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly — здесь лежат скрипты, которые надо выполнять раз в час, день, неделю и месяц соответственно, обычно эти папки используются различными пакетами, но вы тоже можете их использовать для своих скриптов.

Чтобы посмотреть задания cron добавленные текущим пользователем используйте команду crontab и опцию -l:

Все задачи cron разделены по пользователям, и команды из этих задач будут выполнятся от имени того пользователя, для которого они были добавлены. Чтобы посмотреть задачи другого пользователя используйте опцию -u:

А теперь давайте поговорим о том, как добавить команду cron для нужного вам пользователя.

What is Cronjob?

Cron is a task scheduler in UNIX-like systems, which runs shell commands at specified intervals.

If we want to schedule tasks that will be executed often, we need to edit the Crontab. Crontab is a file that contains a list of scripts that will run periodically. 

Cron is a task scheduler daemon that runs scheduled tasks at specific intervals. Cron uses the configuration file called Crontab, also known as the cron table, to manage the scheduling process.

Crontab contains cronjobs, each related to a specific task. Cronjobs are composed of two parts.

  1. Cron expression
  2. Shell command to be run.
* * * * * shell command to run

So what we do here is create the command using Laravel Console and then schedule that command at a particular time. When using the scheduler, you only need to add the following Cron entry to your server.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: