Запуск задания cron из php

Запуск программ по расписанию. Использование CRON

Большинство хостеров предлагают возможность запуска программ по расписанию. Т.е. Вы можете автоматически выполнять некоторые свои программы через определенные интервалы времени. Напимер каждые 30 минут или каждый день. Это бывает очень полезно для проведения обслуживания вашего сайта. Так называемых регламентных операций, например очистка папки с временными файлами, очистка и сжатие базы данных.

Каждая строка в файле /etc/crontab имеет следующий формат:

  • minute — любое целое число от 0 до 59
  • hour — любое целое от 0 до 23
  • day — любое целое от 1 до 31 (день должен быть корректным, если указан месяц)
  • month — любое целое от 1 до 12 (или короткое название месяца, например: jan, feb и так далее)
  • dayofweek — любое целое от 0 до 7, где 0 или 7 означает Воскресенье (или короткое название дня недели, например: sun, mon и так далее)
  • command — команда, которая должны быть выполнена. Командой может быть как простая команда, например, ls /proc >> /tmp/proc , или команда запуска написанного вами специального сценария.

Для любых указанных выше параметров можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц во время, указанное другими параметрами.

Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.

Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.

Косая черта (/) используется для определения шага значений. Целочисленное значение может быть пропущено в диапазоне, если после диапазона указать /целое>. Например, значение минут 0-59/2, определяет, что будет пропущена каждая вторая минута. В качестве шага значений также может быть указана звёздочка. Например, значение месяца */3 определяет, что будет пропущен каждый третий месяц.

Любые строки, начинающиеся с символа решетки (#), являются комментариями, и не обрабатываются.

Как указывать путь к запускаемому через crontab файлу?

Маска пути: ~/public_html/cgi-bin/&
/home/w/windows/public_html/cgi-bin/&
Символ & в конце строки является необязательным элементом и указывает, что программу нужно запустить в фоновом режиме
Символ ~ обозначает путь от корня к домашнему каталогу пользователя

Проблемы с запуском программы по CRON-у

Если Вы действительно правильно указали путь, проверьте формат файла скрипта. Скрипты, запускаемые через crontab, должны быть сохранены в формате Unix. Речь идет о формате конца строки. Он должен быть таким, как принято в системах Unix — LF (вместо CRLF, использующегося в DOS и Windows или CR в системах Macintosh).

В первой строке PHP файла, запускаемого по Cron-у обязательно указание пути до интерпретатора PHP:

Читайте также:  Python what is args kwargs

Или укажите команду для cronа php путь до файла или GET ссылка на файл.

Еще одна проблема, по которой может не выполняться PHP скритпт по крону, это неверные атрибуты файла. Установите флаг выполнения -rwxr-xr-x

Примеры cron заданий

0 */3 * * 2,5 /home/u12345/script.php — скрипт /home/u12345/script.php будет автоматически запускаться каждые три часа во вторник и в пятницу;
0 * * * * /home/u12345/script.php — выполнять задание каждый час в 0 минут;
0 */3 * * * /home/u12345/script.php — выполнять задание каждые три часа в 0 минут;
15 1 * * 1 /home/u12345/script.php — выполнять задание по понедельникам в 1 час 15 минут ночи;
1 0 5 4 * /home/u12345/script.php — выполнять задание 5 апреля в 0 часов 1 минуту каждый год;
13 13 13 * 5 /home/u12345/script.php — выполнять задание в пятницу 13 числа в 13 часов 13 минут;
10 6 1 * * /home/u12345/script.php — выполнять задание ежемесячно 1 числа в 6 часов 10 минут;
30 3 * * mon hello — выполнять команду hello каждый понедельник в 3:30;
10 4 1 * * hello — выполнять команду hello в первый день каждого месяца в 4:10;
5 0 * * * $HOME/bin/daily.job >> $HOME/log/daily 2>&1 — выполнять задание каждый день в 0 часов 5 минут, результат складывать в log/daily;
0 22 * * 1-5 echo «Пора домой» | mail -s «Уже 22:00» john — выполнять задание каждый рабочий день в 22:00;
23 */2 * * * echo «Выполняется в 0:23, 2:23, 4:23 и т. д.» ;
5 4 * * sun echo «Выполняется в 4:05 в воскресенье» ;
0 0 1 1 * echo «С новым годом!» ;
15 10,13 * * 1,4 echo «Эта надпись выводится в понедельник и четверг в 10:15 и 13:15» ;
0-59 * * * * echo «Выполняется ежеминутно» ;
*/5 * * * * echo «Прошло пять минут» — каждые 5 минут.

Т.к. при запуске по cron-у php программы не будут определены системные перемнные такие, как $_SERVER, вы можете использовать мой прием, который позволит Вам не мучаться с отладкой таких CRON-скриптов. Вставьте в самое начало php скрипта следующий код:

if(empty($_SERVER['DOCUMENT_ROOT']))$_SERVER['DOCUMENT_ROOT']=dirname(dirname(__FILE__)); if(empty($_SERVER['HTTP_HOST']))$_SERVER['HTTP_HOST']='htmlweb.ru'; if(!isset($_SERVER['REMOTE_ADDR'])||!$_SERVER['REMOTE_ADDR'])$_SERVER['REMOTE_ADDR']='127.0.0.1'; if(!isset($_SERVER['REQUEST_URI'])||!$_SERVER['REQUEST_URI'])$_SERVER['REQUEST_URI']='/cron.php';

Источник

Запуск PHP скрипта по расписанию cron. Когда не всё так ясно

image

В этой статье я расскажу о некоторых тонкостях запуска php-скриптов на хостингах, незнание которых может попортить немало нервов и начинающим программистам, и мастерам средней руки.
Причина написания статьи: проблемы с запуском скриптов на хостингах с разными настройками. А поскольку настройки могут быть разными, информация приводимая для общих случаев могут не подходить и приводить в заблуждения.

Читайте также:  Messaging applications for java

Немного теории по этим ссылкам: тут и тут, для тех хочет освежить память.

Случай первый


В настройках операционной системы не указаны пути по умолчанию. Как следствие следующая команда в cron не будет выполнена.

php /var/www/LOGIN/data/www/SITE/cron.php 

Правильной командой будет второй вариант, где мы пропишем полный путь до интерпретатора php.

/usr/bin/php /var/www/LOGIN/data/www/SITE/cron.php 

Есть ещё несколько способов запуска php скрипта описанных здесь. Интересным будет здесь то, что php скрипт запускается как файл с командами для консоли и тут можно написать целую тучу команд и описать всевозможные варианты на любой вкус. Код выглядит так.

В команде для выполнения в cron прописывается путь к скрипту и только. В скрипте ставятся символы #!, а дальше просто пишем нужные нам команды на языке bash.

Случай второй


Выполнение скрипта при запросе из браузера приводит к выводу страницы в браузер. А при выполнении скрипта через cron приводит к выводу текста страницы в командную строку. Тут может быть несколько вариантов. Система может быть настроена на сохранение результатов вывода в консоль в виде файла. Причем файл этот может размешаться не в самом типичном месте. Постепенно это может забить всё пространство на диске. Часто под сайт дают место в 1 Гигабайт, 500 мегабайт. И даже встречались хостинги с 50 и 10 мегабайт под сайт.

Как вариант, вывод может быть перенаправлен на почтовый ящик, который заботливый хостер ненавязчиво подарил вам и прописал в настройках хостинга как email по умолчанию. При каждом выполнении скрипта весь текст, выводящийся в консоль, будет оформлен в письмо. Проблемы могут начаться неожиданно. Если задание cron выполняется часто, а у почты хостинга прописано ограничение на количество писем в день, почта просто ляжет (заблокируется провайдером как потенциальный спамер). И как неприятные последствия вы получите отказ в регистрации пользователей, уведомление пользователей и д.р., что подвязано на почту.

Решение старо как мир. Нужно сделать перенаправление вывода из консоли в пустоту. Делается это добавлением команды в конце команды крона.

Иногда админы хостинга берут на себя обязанность ненавязчиво поставить их за пользователя. Тут тоже может быть подводный камень.

Случай третий


Ситуация проста. Нужно отладить скрипт, запускаемый планировщиком. Можно попытаться сделать это средствами php, заставлять скрипт писать логии и т.п. Но есть способ куда проще, нужно перенаправить вывод в файл. Команда проста, дополнительный параметр к нашей команде:

> /var/www/LOGIN/data/www/SITE/log.html 

Её надо добавить в конце команды:

/usr/bin/php /var/www/LOGIN/data/www/SITE/cron.php > /var/www/LOGIN/data/www/SITE/log.html 

Знак «>» указывает системе о перенаправлении вывода. Далее имя файла. В нашем случае указан абсолютный путь. Этот пример не составляет труда найти в интернете. Но тут нас может поджидать неприятность, вытекающая из второго случая. Заботливый хостер автоматически добавляет перенаправление вывода в конце нашей строки. И иногда маскирует это. В итоге получается команда вида:

/usr/bin/php /var/www/LOGIN/data/www/SITE/cron.php > /var/www/LOGIN/data/www/SITE/log.html >/dev/null 2>&1 

В итоге вывод снова перенаправлен в пустоту и выходной файл будет пуст. Тут хостеру можно указать на его ошибку, что он уж слишком перехитрил с настройками. А можно сразу воспользоваться костылём. После команды перенаправления в файл закончить команду символами &&. Эти два символа используются в командной строке для объединения нескольких команд в одной строке. Они дают командной строке понять, что команда окончена и дальше идет следующая команда. К ней и применяется перенаправление в пустоту. В итоге и перенаправление в пустоту осталось и лог файл записан верно. Пример команды:

/usr/bin/php /var/www/LOGIN/data/www/SITE/cron.php > /var/www/LOGIN/data/www/SITE/log.html && >/dev/null 2>&1 
Случай четвёртый


Скрипт запустился, но работает не верно. Причиной тому — интерпретатор php при запуске из командной строки начинает работать в неправильно настроенном окружении, отличным от того, которое было бы при запуске через HTTP-сервер. Первый признак – скрипт не находит файлы, которые лежат с ним в одной директории, а начинает считать себя расположенным в корневой директории пользователя, которая на несколько папок выше чем корень сайта. Первое, что нужно проверить – переменное окружение и супер глобальный массив $_SERVER.

Читайте также:  Раскрывающееся меню html при наведении

Первое, что находишь в интернете по этой проблеме – совет прописать в кроне команду смены директории:

cd /var/www/LOGIN/data/www/SITE/ 

Но в каких-то случаях это не помогает. Выход есть. Один из них взять всё в свои руки и задать недостающее окружение для работы скрипта. Информации про это в интернете уже больше.

Иногда просто хватает вписать следующий код в начале скрипта и пути снова становятся рабочими.

$path_parts = pathinfo($_SERVER['SCRIPT_FILENAME']); // определяем директорию скрипта chdir($path_parts['dirname']); // задаем директорию выполнение скрипта 

Как видите, всё прописано функциями и утруждаться настройками не надо.

Заключение


На этом всё. Проблемы и решения не тривиальны и вообще такое сочетание неудачных настроек встречается редко. Удачи вам при развертывании своих проектов и при переездах.

Источник

Оцените статью