База знаний Виртуальный хостинг Работа с ISPmanager Запуск PHP-скриптов по расписанию Cron в ISPmanager

Запуск PHP-скриптов по расписанию Cron в ISPmanager

Cron запускает PHP-скрипты по расписанию. Например, можно обновлять карту сайта, обрабатывать очередь заданий или выгружать каталог товаров без открытия страницы в браузере.

Подготовьте команду PHP

Если используете пример генерации карты сайта в конце статьи, сначала создайте файл скрипта и укажите в нём свой домен, папку сайта и список страниц. Скрипт перезаписывает sitemap.xml. Сохраните копию существующего файла. Для CMS со своей картой сайта используйте штатное задание CMS.

Для запуска укажите путь к интерпретатору и полный путь к скрипту. В примере PHP 8.3 запускает файл обновления карты сайта.

/opt/alt/php83/usr/bin/php /var/www/hostiman_knowledge/data/generate-sitemap.php

Замените имя пользователя и путь к файлу своими. Скрипт должен существовать и выполнять нужную задачу. Само добавление команды в Cron не создаёт скрипт и не настраивает CMS.

Путь к PHP зависит от версии. Как проверить интерпретатор и консольную версию, описано в статье Консольная версия PHP в ISPmanager. Версия PHP сайта и версия для Cron могут различаться.

Сначала выполните команду в Shell-клиенте ISPmanager. Убедитесь, что она завершается без ошибок и создаёт ожидаемый результат.

Создайте задание

  1. Откройте Планировщик CRON и нажмите Создать задание.
  2. Вставьте подготовленную команду в поле Команда.
  3. В поле Описание укажите назначение, например Обновление sitemap.xml.
  4. Оставьте Включено отмеченным.
  5. В базовом режиме выберите ежедневно и задайте время запуска, например 03:15.
  6. Нажмите Создать. При изменении существующего задания нажмите Сохранить, как на рисунке 1. Проверьте команду, расписание и состояние задания в списке.

Внимание. Расписание ориентируется на время сервера. Оно показано в форме в поле Дата и время сервера и может отличаться от вашего местного времени или часового пояса PHP.

Команда PHP и ежедневное расписание Cron в ISPmanager

Рисунок 1. Цифрой 1 отмечена команда запуска PHP-скрипта, цифрой 2 ежедневный запуск в 03:15, цифрой 3 кнопка «Сохранить» в форме изменения существующего задания.

Записывайте результат и ошибки в журнал

Добавьте перенаправление вывода в файл. Так будет видно, что произошло при автоматическом запуске.

/opt/alt/php83/usr/bin/php /var/www/hostiman_knowledge/data/generate-sitemap.php >> /var/www/hostiman_knowledge/data/sitemap-cron.log 2>&1

>> добавляет вывод в конец журнала, а 2>&1 направляет туда же ошибки. Папка журнала должна существовать и быть доступна вашему пользователю на запись. Храните журнал вне корневой папки сайта, чтобы его нельзя было открыть по HTTP.

После времени запуска откройте файл журнала в менеджере файлов и проверьте результат работы скрипта. Отсутствие ошибок в журнале ещё не означает, что задача выполнена правильно. Проверьте сам результат, например обновлённый sitemap.xml.

Журнал с результатом автоматического запуска PHP-скрипта

Рисунок 2. Цифрой 1 отмечен открытый файл sitemap-cron.log, цифрой 2 пример записи об обновлении карты сайта. Время записи соответствует запуску скрипта и зависит от вашего расписания.

Задайте точное расписание

В экспертном режиме заполните пять отдельных полей. Команду PHP в них вводить не нужно.

Запуск Минуты Часы Дни месяцев Месяцы Дни недели
Каждые 10 минут */10 * * * *
Ежедневно в 03:15 15 3 * * *
По понедельникам в 06:00 0 6 * * 1

Расписание Cron в экспертном режиме ISPmanager

Рисунок 3. Цифрой 1 отмечено переключение в экспертный режим, цифрой 2 минуты и часы запуска, цифрой 3 дни месяца, месяцы и дни недели.

Звёздочка означает любое допустимое значение. Не запускайте длительный скрипт чаще, чем он успевает завершаться. Если приложению нужна защита от одновременного запуска, настройте её по документации приложения.

Если задание не выполняется

  • Проверьте, что оно включено и время запуска уже наступило по часам сервера.
  • Скопируйте команду в Shell-клиент и проверьте полный путь к PHP, путь к файлу и права доступа.
  • Проверьте журнал Cron. Для ошибки самого сайта используйте инструкцию по логам сайта.
  • Если скрипт использует относительные пути, исправьте их или сначала перейдите в папку приложения.
cd /var/www/hostiman_knowledge/data/www/hostiman-knowledge.h1n.ru && /opt/alt/php83/usr/bin/php cron.php

Этот вариант подходит, когда у приложения действительно есть файл cron.php и ему нужна рабочая папка сайта. Для вашей CMS используйте команду из её документации.

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

Пример PHP-скрипта для карты сайта

Для небольшого сайта без CMS можно использовать такой файл generate-sitemap.php. Разместите его в домашней папке аккаунта, укажите свой домен, корневую папку и список опубликованных страниц. Скрипт создаёт sitemap.xml в корне сайта и выводит результат, который Cron сохранит в журнал.

<?php
$site = 'https://hostiman-knowledge.h1n.ru';
$root = __DIR__ . '/www/hostiman-knowledge.h1n.ru';
$pages = ['/' => 'index.html', '/example-page.html' => 'example-page.html'];
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;
foreach ($pages as $url => $file) {
    $path = $root . '/' . $file;
    if (!is_file($path)) {
        throw new RuntimeException('File not found: ' . $path);
    }
    $loc = htmlspecialchars($site . $url, ENT_XML1 | ENT_QUOTES, 'UTF-8');
    $xml .= '  <url><loc>' . $loc . '</loc><lastmod>';
    $xml .= gmdate('Y-m-d', filemtime($path)) . '</lastmod></url>' . PHP_EOL;
}
$xml .= '</urlset>' . PHP_EOL;
if (file_put_contents($root . '/sitemap.xml', $xml, LOCK_EX) === false) {
    throw new RuntimeException('Cannot write sitemap.xml');
}
echo date('c') . ' Sitemap updated, URLs: ' . count($pages) . PHP_EOL;