Yandex Metrika
sanches.free 1 просмотр

PHP в cron на UNIX: строка расписания, полный путь к интерпретатору и минимальный prolog_before для Битрикс

Введение

cron в UNIX-системах — фоновый планировщик: он по расписанию запускает команды от имени пользователя. На хостинге часто действуют лимиты на число задач и минимальный интервал; при работе по SSH мы оперируем личным crontab этого пользователя.

Формат одной строки

Типичная запись содержит шесть частей, разделённых пробелами или табуляцией: пять временных полей и команда.

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

Временные поля задают интервал выполнения. Диапазоны: минуты 0–59, часы 0–23, день месяца 1–31, месяц 1–12, день недели 0–70, и 7 обычно воскресенье). Звёздочка означает «каждый» вариант для этого поля.

  • 0 22 * * * — каждый день в 22:00
  • 0 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 дней гарантии