
Запуск PHP-скриптов по расписанию через cron позволяет автоматизировать задачи, которые нецелесообразно выполнять вручную: регулярная очистка кеша, отправка уведомлений, обновление данных в базе. Настроенный планировщик снижает нагрузку на сервер за счёт распределения фоновых процессов и избавляет от необходимости держать задачи в постоянном цикле выполнения.
Основой является запись в crontab, где указывается время запуска и путь к PHP-интерпретатору с аргументом в виде файла. Например: 0 3 * * * /usr/bin/php /var/www/project/artisan schedule:run запускает скрипт ежедневно в 3:00. Важно явно указывать полный путь к PHP, чтобы избежать конфликтов версий при наличии нескольких интерпретаторов.
В связке с PHP cron превращается в гибкий инструмент управления автоматическими процессами – от мониторинга до интеграции с внешними API. Грамотно составленное расписание повышает предсказуемость работы приложения и снижает риск ошибок при критических обновлениях.
Подготовка PHP-скрипта для запуска через Cron

В начале файла явно указывайте путь к интерпретатору PHP через шебанг, например:#!/usr/bin/php -q
Проверяйте абсолютные пути к файлам и библиотекам. Относительные пути в Cron не работают ожидаемо, так как рабочая директория по умолчанию – корень пользователя. Используйте __DIR__ для указания корректных путей внутри скрипта.
Все результаты и ошибки перенаправляйте в лог. Для этого применяйте конструкции вида:error_log("Ошибка: " . $e->getMessage(), 3, __DIR__."/cron_error.log");
Не используйте функции, требующие интерактивного ввода. Если требуется конфигурация, храните её в отдельном файле и подключайте через require_once.
Для контроля времени работы фиксируйте начало и конец выполнения:$start = microtime(true);// код$duration = microtime(true) - $start;error_log("Время выполнения: {$duration} сек.\n", 3, __DIR__."/cron_time.log");
Завершайте скрипт явным вызовом exit(0);, чтобы Cron корректно фиксировал успешное выполнение.
Создание задачи Cron в Linux для PHP-файла
Для запуска PHP-скрипта по расписанию используется планировщик Cron. Конфигурация выполняется через таблицу crontab, вызываемую командой crontab -e.
Минимальная запись имеет формат:
минуты часы день_месяца месяц день_недели команда
Чтобы выполнять PHP-файл каждые 30 минут, добавьте строку:
*/30 * * * * /usr/bin/php /var/www/project/script.php
Укажите полный путь к интерпретатору PHP. Проверить его можно командой which php. Абсолютный путь к скрипту обязателен, так как Cron не использует переменные окружения пользователя.
*/30 * * * * /usr/bin/php /var/www/project/script.php >> /var/log/script.log 2>&1
После сохранения файла изменения вступают в силу немедленно. Проверить список активных заданий можно командой crontab -l.
Запуск PHP-скриптов с использованием абсолютных путей

При настройке cron критически важно использовать абсолютные пути, так как окружение планировщика задач отличается от интерактивного терминала. Отсутствие полного пути приведёт к ошибкам при вызове PHP или подключении файлов.
Пример корректной записи:
* * * * * /usr/bin/php /var/www/project/scripts/task.php
Рекомендуется заранее уточнить расположение бинарного файла PHP:
which php
или просмотреть несколько доступных версий:
ls -l /usr/bin/php*
Для сложных проектов полезно фиксировать пути к логам, чтобы отслеживать выполнение:
0 2 * * * /usr/bin/php /var/www/project/cron/backup.php >> /var/log/project/backup.log 2>&1
| Элемент | Пример абсолютного пути |
|---|---|
| PHP-интерпретатор | /usr/bin/php |
| Скрипт | /var/www/project/scripts/task.php |
| Лог-файл | /var/log/project/task.log |
Использование абсолютных путей исключает зависимость от переменной PATH и гарантирует, что cron выполнит нужный интерпретатор и правильный файл.
Настройка интервала выполнения Cron-задачи
Интервал выполнения определяется пятью полями в crontab: минута, час, день месяца, месяц и день недели. Для задания конкретного времени указываются числа, для диапазона – дефисы, для шага – символ «/».
Примеры:
*/5 * * * * – запуск каждые 5 минут.
0 * * * * – запуск каждый час в начале часа.
30 2 * * * – выполнение ежедневно в 02:30.
0 0 * * 0 – запуск каждое воскресенье в полночь.
0 */6 * * * – каждые 6 часов.
При необходимости комбинировать условия: 15 9-18 * * 1-5 запускает задачу каждые 15 минут в рабочие дни с 9:00 до 18:59.
Для редких задач удобен синтаксис шагов: 0 0 1 */2 * – запуск первого числа каждого второго месяца.
Рекомендуется проверять корректность выражений через команду crontab -l и тестировать в изолированной среде, чтобы избежать лишних запусков.
Логирование результатов выполнения PHP через Cron

* * * * * php /var/www/project/script.php >> /var/log/project/script.log 2>&1– добавление новых строк в конец файла лога.* * * * * php /var/www/project/script.php > /var/log/project/script.log 2>&1– перезапись лога при каждом запуске.
Для удобства анализа стоит использовать ротацию логов:
- Создать конфигурацию в
/etc/logrotate.d/, указав путь к файлу лога. - Определить период ротации (daily, weekly), максимальное число файлов, сжатие gzip.
- Убедиться, что права доступа позволяют Cron-процессу записывать в новый файл.
php script.php >> /var/log/project/output.logphp script.php 2>> /var/log/project/error.log
Для детализированного логирования внутри PHP целесообразно использовать error_log() с указанием отдельного файла. Пример:
error_log("Старт выполнения: " . date("Y-m-d H:i:s"), 3, "/var/log/project/php_script.log");
Рекомендации:
- Хранить логи в каталоге
/var/log/project/с ограниченным доступом. - Использовать системный syslog для централизованного сбора.
- Очищать или архивировать устаревшие логи во избежание переполнения диска.
Отладка и устранение ошибок при работе Cron с PHP

Убедитесь, что путь к PHP в Cron совпадает с используемым в командной строке. Для этого выполните `which php` и используйте полный путь в Cron-задании, например: `/usr/bin/php /var/www/html/script.php`.
Проверяйте права на выполнение скриптов и доступ к файлам и каталогам. Cron запускается под другим пользователем, поэтому убедитесь, что у него есть права на чтение/запись необходимых директорий и файлов.
Для тестирования Cron-задания выполняйте команду вручную в терминале под тем же пользователем, что и Cron: `/usr/bin/php /var/www/html/script.php`. Это позволяет выявить ошибки, связанные с окружением, которые не видны при запуске через Cron.
Используйте временные метки в логах, например `date(‘[Y-m-d H:i:s]’)`, чтобы видеть, когда выполнялось каждое действие. Это помогает при анализе периодических ошибок и задержек.
Проверяйте переменные окружения. Cron запускает скрипты в ограниченном окружении, поэтому пути к библиотекам, переменные PATH и другие системные переменные могут отличаться от пользовательской сессии. Указывайте абсолютные пути и явно задавайте необходимые переменные.
Для сложных сценариев полезно использовать промежуточные файлы или таблицы базы данных для фиксации состояния выполнения. Это упрощает повторный запуск или восстановление работы скрипта после ошибки.
Если скрипт использует внешние сервисы, проверяйте доступность сети и корректность URL. Для диагностики сетевых проблем применяйте `curl -v` или аналогичные инструменты в скрипте, логируя ответы серверов.
Регулярно проверяйте системные логи Cron (`/var/log/cron` или `/var/log/syslog`) на предмет ошибок запуска. Они содержат сообщения о недоступности PHP, синтаксических ошибках в crontab или проблемах с правами.
Вопрос-ответ:
Что такое Cron и зачем он нужен в PHP-проектах?
Cron — это планировщик задач в Unix-подобных системах. Он позволяет автоматически запускать скрипты по расписанию без участия пользователя. В PHP-проектах это удобно для регулярных операций, таких как очистка кэша, отправка уведомлений, резервное копирование базы данных или генерация отчетов.
Как настроить задачу Cron для PHP-скрипта на Linux?
Чтобы создать задачу Cron, нужно открыть файл crontab командой crontab -e и добавить строку с расписанием и командой запуска PHP-скрипта. Например, для запуска скрипта /var/www/html/script.php каждый день в 3 часа утра: 0 3 * * * /usr/bin/php /var/www/html/script.php. Здесь /usr/bin/php — путь к интерпретатору PHP, а расписание задается пятью полями: минуты, часы, день месяца, месяц, день недели.
Можно ли запускать несколько PHP-скриптов одной Cron-задачей?
Да, это возможно. В crontab можно указать несколько команд через точку с запятой или создать отдельный PHP-скрипт, который будет вызывать нужные функции из других скриптов. Например: 0 2 * * * /usr/bin/php /var/www/html/main.php, а в main.php вызывать include 'task1.php'; include 'task2.php';. Такой подход удобен, если задачи связаны между собой или должны выполняться последовательно.
Как проверять, что Cron-задание выполнено корректно?
Для контроля можно перенаправлять вывод скрипта в лог-файл. Например: /usr/bin/php /var/www/html/script.php >> /var/log/script.log 2>&1. В этом случае стандартный вывод и ошибки сохраняются в script.log. Также полезно использовать встроенные функции PHP для записи событий в отдельный файл или отправки уведомлений по электронной почте в случае ошибок.
Что делать, если Cron-задание не запускается?
Сначала нужно проверить, работает ли сам демон cron: systemctl status cron или service cron status. Затем убедиться, что путь к PHP указан верно и скрипт имеет права на выполнение. Полезно тестировать команду вручную в терминале. Иногда проблема связана с окружением: переменные среды в crontab могут отличаться от пользовательских. В таких случаях можно явно задавать необходимые пути в скрипте.
