Запуск хронометра (cron)

13 Май 2008
Опубликовано VladSavitsky
Задача: 

Запуск хронометра (cron)Настроить запуск хронометра (cron).

Решение

По крону в Drupal выполняются например такие задачи, как индексация контента для работы поиска, отправка писем подписчикам и пр. функции - модули сами могут давать задания для выполнения по расписанию.

Запускаются задания вызовом cron.php лежащего в корне сайта. Поэтому надо прописать его вызов в crontab с периодичностью зависящей от посещаемости сайта - где-нибудь от 30 мин до 1.5-2 часов.

Варианты

  • Вручную.
  • Из OS сервера.
  • Через панель управления хостингом.
  • С помощью дополнительных модулей Drupal.
  • С помощью внешних сервисов.
  • Вызов cron.php своего сайта с другого хостинга, на котором доступен crontab..

Вручную

example.com/cron.php

(Откроется пустая страница. В случае успешного выполнения, в логах останется сообщение)

Друпал 6: admin/reports/status/run-cron
После выполнения откроется страница "Отчет о состоянии" (admin/reports/status) с сообщение о том, как была выполнена эта команда.

Друпал 5: admin/logs/status/run-cron
После выполнения откроется страница "Отчет о состоянии" (admin/reports/status) с сообщение о том, как была выполнена эта команда.

Из OS сервера

Unix

Необходимо создать файл .crontab, в домашнем каталоге и занести строчку, которая будет содержать время и имя скрипта.
Формат команд в Википедии.

Windows

Запуск cron.php в Windows - инструкция с картинками.

Через панель управления хостингом

Варианты команд запуска скрипта cron.php

  • Через lynx или wget
  • Через /usr/local/bin/php

Сначала нужно выяснить, имеется ли в наличии команда и путь к ней:

which curl
which lynx
which wget

Через lynx или wget

Вызывать cron.php удобно например через lynx или wget.
Готовый shell-скрипт делающий это лежит в scripts/cron-lynx.sh. Там надо только поправить имя хоста (но не указывать localhost, указать его так же как к сайту обращаются из веба).
Файл скрипта должен быть исполняемым хотя бы для владельца.

Пример (запуск cron.php каждый час):

0 * * * * /usr/bin/wget -O - -q http://www.ВашСайт.ru/cron.php
0 * * * * /usr/bin/lynx -source http://www.ВашСайт.ru/cron.php > /dev/null 2>&1

перед тем, как записывать эти команды себе в crontab, проверьте, что программа (wget или lynx) находится в /usr/bin. Это может быть не так! Для проверки пути wget запустите whereis wget - будет выведен список файлов, содержащих слово wget.

Опция -q при дёрганьи wget'ом точно должа помочь. У самого была такая проблема, оказалось, что это фича wget. Он просто сохраняет страницу, которую выгреб, а если страница с данным именем уже существует, приплючоввывает счетчик в конец. Посему, как и сказал товарищ Dan, используйте -q в параметрах wget

wget -q http://www.ВашСайт.ru/cron.php

На половине хостингов катит так (запуск cron.php каждый час, на 38 минуте):

38 * * * * wget -O - -q http://www.example.com/cron.php
38 * * * * lynx -source http://www.example.com/cron.php > /dev/null 2>&1

Как запускать cron.php каждый день в час дня и час ночи?

0 1,13 * * * wget -O - -q http://example.com/cron.php

Применение утилиты wget без параметров (по умолчанию) означает: количество попыток загрузки 20, а длительность каждой попытки 900 сек. (15 мин.) !!! Довольно длительное "зависание" может получится (5 часов)...
Команда "wget -O - " означает (в том числе) запуск утилиты wget только один раз.

curl:

curl --silent --compressed http://example.com/cron.php

Командой: /usr/local/bin/php /home/example.com/cron.php

В этом случае в cron.php включение файлов нужно делать не по относительному пути, а по абсолютному. Вот как должен выглядеть cron.php:

<?php
// $Id: cron.php,v 1.36 2006/08/09 07:42:55 dries Exp $
 
/**
* @file
* Handles incoming requests to fire off regularly-scheduled tasks (cron jobs).
*/
 
$_SERVER['HTTP_HOST'] = 'example.com';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
$_SERVER['REQUEST_METHOD'] = 'GET';
 
chdir('/home/example.com/public_html');
 
include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 
flashvideo_cron();
/*
$users = db_query('SELECT * FROM {users}');
while($user = db_fetch_array($users)) {
echo $user['name'] . '\n';
}
 
echo 'all';
*/

С помощью дополнительных модулей Drupal

Если crontab на хостинге не доступен, есть модуль poormanscron. С ним Drupal работает также как большинство CMS - грузит задания планировщика при вызове страниц пользователями.

Poormanscron позволяет при каждом открытии страницы сравнивать дату предыдущего срабатывания cron. Если она больше указанного промежутка времени запустит на выполнение cron.

С помощью внешних сервисов

Существуют специальные сайты, которые позволяют настроить запуск cron на вашем сайте:

  • Web-cron.ru представляет собой сервис, предназначенный для регулярного запуска крона на Ваших drupal-сайтах. Он полностью заменяет стандартный crontab, который зачастую используют на сервере. Помимо этого, данный сайт можно использовать для выполнения скриптов и програм в Ваших веб-проектах. Запуск осуществляется с определенной периодичностью, или по-расписанию. Кроме запуска по расписанию, имеется возможность отслеживать время отклика Ваших заданий (пинг сайтов).
  • www.webcron.org - на француском,
  • cron-server.de - на немецком.
  • cronjob.ru - русскоязычный сервис.

Использованные материалы:

Полезные ссылки:

Авторы решений:
Версия Drupal:

Комментарии

Здравствуйте,
У меня cron.php не работает с кронтабом. Когда ввожу вручную например: http://www.vitalmlm.com/mailtux/adm/cron.php выдает сообщение --> Can't update Cache! Time Start Function: 2009-02-10 03:28:57 Time End Function: 2009-02-10 03:30:47 End... а когда крон отпавляет на cron.log свое сообщение выдается Wrong Licence!End... ЧТО МОЖНО СДЕЛАТЬ?

Тимур | Фев 10th, 2009 в 1:37 утра

Вы все напутали. Прочитайте ещё раз статью внимательно.
В кронтабе прописывается не путь к cron.php на веб-сервере, а в путь в файловой системе.

VladSavitsky | Фев 11th, 2009 в 2:29 после полудня

В Drupal5 для запуска cron командой листинг кода не верный. Вместо flashvideo_cron(); (что это вообще? :)) необходимо выполнять drupal_cron_run(); да и каменты можно было бы удалить (ПМСМ).
С уважением!

Expier | Июл 9th, 2009 в 5:30 после полудня

Здраствуйте !!!
Столкнулся с такой проблемой ...
Всем пользователям на мыло шлётся сообщение с таким содержанием :

Warning: include_once(): Filename cannot be empty in /sata1/home/users/ahava/www/www.ahava.com.ua/cron.php on line 9

Warning: include_once(): Failed opening '' for inclusion (include_path='.:/usr/local/share/pear') in /sata1/home/users/ahava/www/www.ahava.com.ua/cron.php on line 9

Fatal error: Call to undefined function drupal_bootstrap() in /sata1/home/users/ahava/www/www.ahava.com.ua/cron.php on line 10

Голову уже сломал ... Не могли бы Вы помочь каким-то советом !!!

Гость | Янв 11th, 2010 в 1:18 утра

Нужно прочитать внимательно сообщение об ошибке и принять меры.
1. Открыть ваш файл cron.php и посмотреть какой файл инклюдится в 9й строке.
2. Проверить наличие этого файла (РНР жалуется, что файл пустой)
3. Отключить вывод предупреждений в php и в друпал

Вызывается функция, которая не определена - function drupal_bootstrap() скорее всего не закачался какой-то файл ядра, содержащий эту функцию.
Короче говоря, ищите файлы с нулевой длинной и закачивайте их заново на сервер.
К крону эта ошибка не имеет никакого отношения.

VladSavitsky | Янв 11th, 2010 в 3:12 после полудня

С помощью внешних сервисов:
http://cronjob.ru/ - еще один сервис...

Wily | Янв 13th, 2010 в 1:45 утра

Добавил cronjob.ru к списку сервисов.

VladSavitsky | Янв 19th, 2010 в 12:06 утра
 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>