Ноя
06
2021

Добавление PHP скрипта в cron

Cron - это демон (программа, которая постоянно работает в системе в фоновом режиме), представляющий собой планировщик задач в UNIX-подобных операционных системах, который в определенное время автоматически выполняет задания. Пример задания - регулярное создание резервной копии.

Каждый пользователь сервера может добавлять свои задания, указывая, в какое время и какие скрипты нужно выполнять от его имени. Задания могут выполняться, например, раз в день, раз в месяц, раз в год.. На вашем хостинге могут действовать ограничения на общее количество заданий и на то, как часто может выполняться задание (Например, не чаще 1 раза в 10 минут и не более 10 cron-заданий).

Структура крон задания

Задание (таблица crontab) включает 6 разделов, разделяемых пробелами или табуляцией.

минуты   часы   день_месяца   месяц   день_недели   команда

Первые пять разделов задают время выполнения скрипта:
минуты: 0-59
часы: 0-23
день месяца: 1-31
месяц: 1-12
день недели: 0-7 (0 и 7 - воскресенье)
* - диапазон с первого до последнего.

команда задает скрипт, который нужно выполнять, например, скрипт на php. Если команда передает текст в стандартный вывод, этот текст отправляется на e-mail пользователя, но стандартный вывод можно перенаправить в /dev/null:

команда >/dev/null 2>&1

Примеры задания времени выполнения скрипта:
0 22 * * * - каждый день в 22:00 (в 0 минут, в 22 часа, каждый день, каждый год, каждый день недели)
0 0 1 * * - раз в месяц (в 0 минут 0 часов первого числа каждого месяца)
0,30 10-22 * * * - каждые полчаса между 10:00 и 22:00 (в 0 и 30 минут с 10 до 22 часов каждый день)
*/10 * * * * - каждые 10 минут

Онлайн генератор crontab для PHP скрипта

Чтобы выбрать несколько значений из списка, зажмите Ctrl.

Команда:
Минуты


Часы


День месяца


Месяц


День недели




Результат:

Добавить скрипт 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['DOCUMENT_ROOT']. В этой переменной хранится корневая папка сайта. А когда мы запускаем скрипт через консоль - никакого сайта нет. Файл мы можем хоть откуда запускать, сайт не требуется для этого.

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

<?php
$_SERVER[' DOCUMENT_ROOT '] = __DIR__;

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

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

Добавление крон

С основными ошибками закончили, приступим к делу!

Чтобы запустить файл, нужен полный путь к нему. Для этого перейдите в папку с файлом, и введите команду pwd, скопируйте путь.

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

Берем команду и вставляем её в генератор, настраиваем время, жмем создать. Получаем строку по типу 1 1,13 * * * /usr/bin/php /var/www/myscript.php - это запуск php скрипта 2 раза в день.

Для редактирования крон заданий существует команда crontab -e. Введите её в терминале и добавьте в самый низ полученную ранее строку, сохраните.

Важно: после последнего задания должна быть одна пустая строка, иначе работать не будет. Так устроен крон.

Всё, задание добавлено.

Чтобы просмотреть список заданий, используйте команду crontab -l.

Настройка уведомлений о работе крон на электронную почту

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

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

Пожалуйста, оцените на сколько вам понравилась статья!
Голосов: 13 Среднее: 5