Cron запускает 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. Убедитесь, что она завершается без ошибок и создаёт ожидаемый результат.
Внимание. Расписание ориентируется на время сервера. Оно показано в форме в поле Дата и время сервера и может отличаться от вашего местного времени или часового пояса PHP.
Рисунок 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.
Рисунок 2. Цифрой 1 отмечен открытый файл sitemap-cron.log, цифрой 2 пример записи об обновлении карты сайта. Время записи соответствует запуску скрипта и зависит от вашего расписания.
В экспертном режиме заполните пять отдельных полей. Команду PHP в них вводить не нужно.
| Запуск | Минуты | Часы | Дни месяцев | Месяцы | Дни недели |
|---|---|---|---|---|---|
| Каждые 10 минут | */10 | * | * | * | * |
| Ежедневно в 03:15 | 15 | 3 | * | * | * |
| По понедельникам в 06:00 | 0 | 6 | * | * | 1 |
Рисунок 3. Цифрой 1 отмечено переключение в экспертный режим, цифрой 2 минуты и часы запуска, цифрой 3 дни месяца, месяцы и дни недели.
Звёздочка означает любое допустимое значение. Не запускайте длительный скрипт чаще, чем он успевает завершаться. Если приложению нужна защита от одновременного запуска, настройте её по документации приложения.
cd /var/www/hostiman_knowledge/data/www/hostiman-knowledge.h1n.ru && /opt/alt/php83/usr/bin/php cron.php
Этот вариант подходит, когда у приложения действительно есть файл cron.php и ему нужна рабочая папка сайта. Для вашей CMS используйте команду из её документации.
Чтобы приостановить задание, откройте его, снимите Включено и сохраните изменения. После проверки временного расписания верните нужную периодичность.
Для небольшого сайта без 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;