Меню Закрыть

Cron выполнение php скрипта

Содержание

Выполнение некоторых задач требует использование планировщика — специальной программы, которая запускает те или иные скрипты, программы и т. д. в определенный момент времени. В большинстве случаев это 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 режиме нет ограничения времени или же оно точно больше минуты. Да и пример по ссылке как раз таки про обратное решение

Читайте также:  Материнская плата msi 970a g43 plus обзор

Что как и почему в 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 и не заполняет переменные окружения.

Читайте также:  Sapphire radeon hd 6670 драйвер

В команде необходимо указать путь к 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 минут, но как понять в чем ошибка не пойму.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.