Содержание
Выполнение некоторых задач требует использование планировщика — специальной программы, которая запускает те или иные скрипты, программы и т. д. в определенный момент времени. В большинстве случаев это Cron. Может, есть и другие, но о них я ничего не знаю. В этой статье расскажу о некоторых особенностях настройки Cron на примере запуска PHP-скрипта.
Задания в Cron и запуск PHP-скрипта
Сама запись (задание) в Cron (чаще по имени папки crontab или crontabs) состоит из временной метки и команды. Временная метка задания включает в себя значения: день недели, месяц, день, час и минута, а команда (часто называется: задание) , по крайне мере в случае с запуском скрипта, может состоять из интерпретатора и самого срипта, например:
В данном случае: `/usr/bin/which php` – абсолютный путь до интерпретатора PHP, а /home/l/login/public_html/script.php – абсолютный путь до php-скрипта. Примечательно, что путь к интерпретатору и скриптам у вас могут отличаться, т. к. зависят от настроек веб-сервера.
Настройка Cron через ПУ
Большинство хостинг-пройвайдеров предоставляет клиентам специальную панель управления (ПУ) хостингом, что облегчает настройку и работу с записями Cron. Вот как выглядит запуск php-скрипта cron_admitad.php в планировщике на SpaceWeb.
Настройка Cron и запуск PHP-скрипта
Обратите внимание — путь к интерпретатору здесь не указан (об этом чуть позже) . Также следует отметить использование символа «тильда» (
) в качестве псевдонима «домашнего каталога» (с учетом приведенного примера: /home/l/login ) . Если проще, то это тот каталог, в который, при обычных условиях, вы изначально попадаете по FTP.
Путь к интерпретатору в php-срипте
Большинство задач имеет множество решений. Зачастую сложно сказать какое из них оптимально, но речь не об этом.
Символ «решетка» ( # ) в PHP является комментарием, но последовательность #! (англ. bang line, hash-bang или she-bang) имеет специальное значение – она указывает путь к интерпретатору скрипта.
Дело в том, что в UNIX-подобных операционных системах скрипты могут создаваться на разных языках: PHP, Perl, Python и т. д. Когда скрипт выполняется веб-сервером, он ориентируется на расширение файла (например: .php , .phtm , phtml и т. д. – это обычные расширения для PHP интерпретатора) . UNIX-подобные операционные системы на расширение файла, как правило, не ориентируются – его зачастую у файла просто нет. Система считывает первую строку и ищет обработчик скрипта.
В ранее упомянутом php-срипте, первой строкой у меня идёт запись:
Опять же, путь к интерпретатору PHP у вас может отличаться от указанного пути в примере, т. к. всё зависит от настроек веб-сервера.
Пути к файлам в скрипте, запускаемом через Cron
Ещё один немаловажный нюанс. Если в скрипте используются функции require() , include() , fopen() и т. д., подразумевающие обращение к сторонним файлам на веб-сервере, вам нужно указать абсолютный путь, например:
Опять же, путь к файлу coupons.db у вас может отличаться от указанного пути в примере, т. к. всё зависит от настроек веб-сервера.
В целом, можно использовать и относительный путь. Для этого воспользуйтесь php-функцией chdir() , которая меняет текущий каталог PHP, на указный в качестве её параметра.
Честно говоря, я не использовал эту функцию, но как понимаю, дело обстоит следующим образом. Перед обращением к стороннему файлу на веб-сервере, вставляется что-то вроде следующего кода:
Таким образом, файл, с учётом приведенного примера, будет доступен по относительному пути:
Точка в начале означает текущий, изменённый каталог.
Подведём итоги настройки Cron
Cron (часто называется по имени папки crontab или crontabs) – программа планировщик запущенная на веб-сервере хостинг-проваqдера, которая выполняет запуск скриптов, программ и др. команд в определенный момент времени. Само задание представляет собой запись состоящую из временной метки и команды. Важным моментом здесь является указание правильных путей к интерпретатору скрипта и подключаемым в нём файлам.
Короткая ссылка: http://goo.gl/JXVVV2
Интересно, а чем можно запускать сценарий чаще, чем раз в минуту? Например, мой сценарий проверяет страницы на индексацию. И если я проверяю по крону 10 000 страниц (по 1 странице за раз), то они будут проверяться 7 дней.
30 ноября 2013 г., 4:41 Удалить комментарий
По всей видимости, здесь всё зависит от мощностей и лимитов сервера, а чем м как именно запускать скрипт не столь уж и принципиально. На мой взгляд, для обработки большого объема данных лучше использовать многопоточность, основанную на работе нескольких серверов, которые сливали бы конечный результат в одну базу, если такое нужно. Каждая задача имеет множество вариантов решения и лучше рассматривать конкретный случай. имхо.
30 ноября 2013 г., 5:55 Удалить комментарий
У меня конкретно виртуальный сервер, один единственный. Я могу написать десктопную софтину, которая будет делать запросы к скрипту каждые 5 секунд, чтобы нужная мне проверка выполнилась в 20 раз быстрее. Но, думаю, под линукс можно написать такую же софтину, которая будет работать в фоновом режиме. Хотелось бы узнать, случалось ли вам видеть нечто подобное?
30 ноября 2013 г., 14:26 Удалить комментарий
Мне не доводилось заниматься масштабными проектами, а для решения чего-то подобного я тупо использовал генератор запросов на PHP, с применением AJAX. он то всё делает по мере возможности 🙂 просто и не претенциозно.
30 ноября 2013 г., 15:11 Удалить комментарий
Вот хак для задач с периодичностью меньше минуты — http://plutov.by/post/cron_every_30_sec
24 июня 2014 г., 23:58 Удалить комментарий
2plutov.by ну, разве что если увеличить время выполнения скрипта, а так оно оборвет просто его действие. имхо.
25 июня 2014 г., 0:41 Удалить комментарий
Обычно в CLI режиме нет ограничения времени или же оно точно больше минуты. Да и пример по ссылке как раз таки про обратное решение
Что как и почему в WordPress
Задания Cron
Cron — это демон (программа, которая постоянно работает в системе в фоновом режиме), представляющий собой планировщик задач в UNIX-подобных операционных системах (включая сервер Apache), который в определенное время автоматически выполняет задания. Пример задания — копирование базы данных в определенное место на сайте (создание резервной копии).
Каждый пользователь системы может добавлять свои задания, указывая, в какое время и какие скрипты нужно выполнять от его имени. Задания могут выполняться, например, раз в день, раз в месяц, раз в год.. На вашем хостинге могут действовать ограничения на общее количество заданий и на то, как часто может выполняться задание (Например, не чаще 1 раза в 10 минут и не более 10 cron-заданий).
Задание (таблица crontab) включает 6 разделов, разделяемых пробелами или табуляцией.
Первые пять разделов задают время выполнения скрипта:
минуты: 0-59
часы: 0-23
день месяца: 1-31
месяц: 1-12
день недели: 0-7 (0 и 7 — воскресенье)
* — диапазон с первого до последнего.
команда задает скрипт, который нужно выполнять, например, скрипт на Perl или на php. Если команда передает текст в стандартный вывод, этот текст отправляется на e-mail пользователя, но стандартный вывод можно перенаправить в /dev/null:
Примеры задания времени выполнения скрипта:
0 22 * * * — каждый день в 22:00
0 0 1 * * — раз в месяц
0,30 10-22 * * * — каждые полчаса между 10:00 и 22:00
0/10 * * * * — каждые 10 минут
Права доступа
На скрипт рекомендуется выставить права доступа 755 (права на исполнение).
Добавление задания Cron в ISPmanager
В ISPmanager параметры выполнения для крона задаются в отдельных полях формы.
Войдите в Главное — Планировщик и нажмите кнопку "Создать". В появившейся форме задайте Команду и Период (периодичность выполнения), а также выберите опцию Не отправлять отчёт по e-mail.
Команда — это путь до интерпретатора (у меня сработало просто php), пробел и полный путь до скрипта:
*** Полный путь до скрипта включает путь к корневой директории сервера, который можно узнать, выполнив в браузере:
Период — периодичность выполнения задания можно выбрать из списка (базовый режим):
каждый час — выполнение в 0 минут каждого часа.
каждый день — выполнение ежедневно ровно в 00:00.
раз в неделю — выполнение каждое воскресенье ровно в 00:00.
раз в месяц — выполнение первого числа каждого месяца ровно в 00:00.
раз в год — выполнение каждый год 1 января ровно в 00:00.
или задать вручную (экспертный режим)
Добавление задания Cron в cPanel
В cPanel войдите в "Дополнительно", "Задания Cron" и заполните форму добавления задания.
Особенности выполнения php-скрипта в задании Cron
В выполняемом php-скрипте не должны использоваться переменные окружения. Например, адреса следует прописывать явно. Дело в том, что при выполнении cron-задания в php-скрипте недоступны серверные переменные (например, $_SERVER, $_GET), т.к. веб-сервер Apache не участвует в работе демона cron и не заполняет переменные окружения.
В команде необходимо указать путь к php (может отличаться для разных хостингов), например, /usr/bin/php, затем пробел и полный путь к файлу скрипта:
Пример Cron-задания для выполнения php-скрипта один раз в день (0 0 * * * — задает периодичность)
Задания Cron на выполнение php-скриптов : 13 комментариев
А как подавить отсылку на емайл сообщений крона?
команда >/dev/null 2>&1
Доброго времени.
У вас отличный блог, странно, почему я на него раньше не попадал.
Столкнулся, не в первый раз уже, с работой cron в вордпресс.
В свое время, вырубил его функционал в wp-config, потому что при обращении к wp-cron.php с хостинга возвращает 404.
Покурив интернет, выяснил, что это происходит когда в hosts на хостинге прописано 127.0.0.1 localhost, а wordpress-у нужно, в данном случае, чтоб был прописан адрес моего блога. Хостинг виртуальный, провайдер что-либо делать отказался. Ну я отключил. А сейчас решил поставить wp super cache, но сия зверюга натыкаясь на 404 ставиться не хочет.
Не подскажете, где бы его чего почитать более-менее толковое про этот чертов функционал? Второй раз за месяц по интернету прохожусь с этими вопросами, но такое ощущение, что это или заговор, или я не там ищу.
Хочу отпинать или вордпресс, чтоб дергался крон сервера хостинга, либо научить кэширующий плагин работать с внешним кроном.
Благодарю.
Спасибо пост реально очень помог
Скрипты могут не работать из-за указания расширения в названии файла
А можно "для особо одаренных" или, вернее, для вообще ничего не знающих в php подробнее написать, куда вставить строку-php или что там еще.
Задание в Cron — это логически понятно — выставить время, а вот мне например, надо выставить задание для создания backup сайта. Какую команду и куда ее вписать?
Уууу полегчало, оказывается что так просто 🙂
Описано легко и понятно. Только у Вас получается, что в неделе 8 дней (от 0 до 7)
Поправьте, плз, а то чайники запутаются. 🙂
День недели может быть задан числом от 0 до 7, причем 0 и 7 соответствуют воскресенью.
Здравствуйте, у меня такой вопрос, куда вписывать путь к файлу PHP? хотелось бы по подробнее.
Можно ли отправить резервную копию на e-mail? (именно копию, а не отчёт). Если да, то как?
Права на выполнение скрипта стоят.
Сервер — ubuntu.
через консоль открываю crontab crontab -e ,
далее пишу чтобы каждые 5 минут выполнялся скрипт
Сам php скрипт на удаление файлов в одной из папок. И если из браузера открыть его, то файлы удаляются. А крон чего-то не хочет его выполнять.
Заходил в var/log/syslog и там есть записи каждые 5 минут, но как понять в чем ошибка не пойму.