PHP в cron на UNIX: строка расписания, полный путь к интерпретатору и минимальный prolog_before для Битрикс
Введение
cron в UNIX-системах — фоновый планировщик: он по расписанию запускает команды от имени пользователя. На хостинге часто действуют лимиты на число задач и минимальный интервал; при работе по SSH мы оперируем личным crontab этого пользователя.
Формат одной строки
Типичная запись содержит шесть частей, разделённых пробелами или табуляцией: пять временных полей и команда.
минуты часы день_месяца месяц день_недели командаВременные поля задают интервал выполнения. Диапазоны: минуты 0–59, часы 0–23, день месяца 1–31, месяц 1–12, день недели 0–7 (и 0, и 7 обычно воскресенье). Звёздочка означает «каждый» вариант для этого поля.
0 22 * * *— каждый день в 22:000 0 1 * *— первое число каждого месяца в полночь0,30 10-22 * * *— в начале часа и в половине с 10:00 до 22:59*/10 * * * *— каждые десять минут
Если цель скрипта не сопровождать административную почту, стандартный вывод и ошибки часто отправляют в «пустоту»: /dev/null 2>&1 в конце команды или отдельной настройкой (см. ниже).
Запуск PHP из консоли
Синтаксис в терминале привычен: php /полный/путь/скрипт.php. Внутри cron окружение миниатюрнее интерактивного входа по SSH, поэтому важно три момента.
- Исполняемый файл php. Команда
which phpилиwhereis phpподсказывают абсолютный путь; в задании лучше использовать его (/usr/bin/php,/usr/local/bin/php8.2и т.д.), а не надеяться наPATH. - Версия и ini. То, что открывает браузер, и то, что стартует из CLI, могут быть разными бинарниками. Сверьте
/полный/путь/php --versionс версией черезphpinfo()на сайте. Для нужного.iniили параметра временно помогает-d date.timezone=Europe/Moscowбез правки конфигов уровня всего сервера. - Пользователь и окружение. Cron исполняется от пользователя записи таблицы. Владельцы файлов, создаваемых скриптом из браузера и из CLI, могут совпасть только если задача добавлена от того же аккаунта, что использует нужный виртуальный хост и корректные права каталогов.
Для сайта на 1С‑Битрикс: документ-рут и минимальный prolog
При работе через веб установлен контекст SITE_ID, константы, автозагрузка. В голом CLI этого нет: при обращении к API ядра заранее объявите $_SERVER["DOCUMENT_ROOT"] корнем публичной части проекта (__DIR__ если скрипт лежит в корне документа, иначе dirname(__DIR__) и тому подобное) и подключите пролог перед бизнес-логикой.
if (php_sapi_name() !== 'cli') {
exit;
}
// Корень документа сайта рядом с index.php:
$_SERVER['DOCUMENT_ROOT'] = __DIR__;
// Либо, если файл в подпапке: realpath(__DIR__ . '/..') и проверить путь до /bitrix
define('LANGUAGE_ID', 's1'); // код сайта из настроек инфопанели
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
// дальше код агента, выборки или событий
Точный способ указания корня зависит от расположения файла; ключевая идея — чтобы путь совпадал с тем же деревом модулей, что обслуживает веб-запросы. Если права нужны пользовательские или административные, не оставляйте NOT_CHECK_PERMISSIONS вечным «решением» без явной модели авторизации или сервисного пользователя.
Регистрация задания
Уточните абсолютный путь к скрипту (cd в каталог, pwd). Пробный запуск вручную с тем же интерпретатором, что будет в строке cron, экономит время на отладку. Редактор таблицы планирования этого пользователя: crontab -e. Вставьте готовую строку в конец, убедитесь, что файл заканчивается переводом строки (у некоторых окружений иначе «последняя строка может не считаться»). Просмотр: crontab -l.
Письма cron и MAILTO
По умолчанию почтовые уведомления могут отправляться владельцу заданий. Переменная MAILTO в начале таблицы задаёт адрес; пустое значение обычно отключает рассылку вывода, если ваш вариант cron это поддерживает и политики хостинга допускают.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии