Хостинг крон задач разберем детали


Установка задачи и сриптов на крон (cron) на хостинге Ps.Kz - Планировщик Задач



Подскажите, как поставить крон-задачу?

Добрый день всем! Подскажите, как поставить крон-задачу. У меня пункт в установке: 4. Поставить крон задачу на /cron/siteinfo_upd.php (каждый час), /cron/cron_upd.php (каждые 10 мин), /cron/check_konkurs.php (каждые 30 мин), /cron/cleaner.php (каждые 5 мин)

Юзеры ( 2 ) оценили на 4.5 из 5

Настоятельно рекомендуем не покупать слишком дешевый хостинг! Как правило с ним очень много проблем: сервер иногда не работает, оборудование старое, поддержка долго отвечает или не может решить проблему, сайт хостера глючит, ошибки в регистрации, оплате и т.д.

Также мы собрали тарифы от тысяч хостеров, чтобы вы могли выбрать хостинг по конкретной цене.

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

Виртуальный хостинг - подходит для большинства проектов начального уровня с посещаемостью до 1000 человек в сутки. В таком хостинге мощность сервера делится между несколькими хостинговыми аккаунтами. Услуга проста в настройке даже для новичков.

VPS - подходит для более сложных проектов с достаточно большой нагрузкой и посещаемостью до 10000 человек в сутки. Здесь мощность сервера фиксированная для каждого виртуального сервера, при этом сложность настройки увеличивается.

Выделенный сервер - нужен для очень сложных и ресурсоемких проектов. Для вас выделяют отдельный сервер,мощность которого будете использовать только вы. Дорого и сложно настраивать.

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

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

Тестовый период - предоставляется хостером бесплатно на 7-30 дней, чтобы вы могли удостовериться в его качестве.

Moneyback - период на протяжении которого хостер обязуется вернуть деньги, если вам не понравится хостинг.

Означает какая операционная система установлена на сервере хостинга. Мы рекомендуем размещать на серверах с Linux, если нет особых требований у разработчиков сайта.

Абузоустойчивый хостинг - компании, которые разрешают размещать практически любой контент, даже запрещенный (спам, варез, дорвеи, порнографические материалы). Такие компании не удаляют контент вашего веб-сайта при первой же жалобе (“абузе”).

Безлимитный хостинг - хостинг у которого отсутствуют лимиты на количество сайтов, БД и почтовых ящиков, трафик, дисковое пространство и т.д. Обычно это больше маркетинговый трюк, но можно найти что-то интересное для себя.

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

Защита от DDOS - компании, которые предоставляют хостинг с защитой от DDoS-атак. Такие пакеты ощутимо дороже обычных, но они стоят своих денег, так как ваш сайт будет защищен от всех видов сетевых атак.

На языке программирования PHP и базах данных MySQL сейчас работает большинство сайтов. Они же поддерживаются практически всеми современными хостингами.

ASP.NET - платформа для разработки веб-приложений от Майкрософт.

От панели управления зависит ваше удобство в настройке хостинге/сайта.

Большинство качественных хостингов из нашего ТОПа используют удобные панели управления, поэтому рекомендуем больше внимания уделить другим параметрам при выборе.

Хостинг крон задач,

На ящик postmaster приходит следующее:
PHP Warning: Unknown(): Invalid library (maybe not a PHP library) xml.so in Unknown on line 0

Подскажите ошибку либо вариант решения, буду премного благодарен. За глупые ошибки вышеописанного просьба тапками не кидаться, я не волшебник, я только учусь ©

Меню пользователя Alius
Посмотреть профиль
Отправить личное сообщение для Alius
Найти ещё сообщения от Alius

Alius, решение неверное: заголовок Location воспринимается лишь браузером, а когда Вы напрямую запускаете скрипт с помощью интерпретатора PHP, ему этот заголовок ничего не скажет - он просто выведет его на экран.

Поэтому самый простой способ запуска такого задания - использовать браузер.

Что касается приходящих писем - игнорируйте их. Такое сообщение в письмах не говорит о каких-либо ошибках.

04.08.2011, 15:47 #2
Меню пользователя Станислав Муравьев
Посмотреть профиль
Найти ещё сообщения от Станислав Муравьев

Прошу помощи с выполнением ежедневной задачи по обновлению статистики cron
Исходные данные: в cron.php указываю команду на выполнение ежедневно обновление статистики:
30 01 * * * wget -q http://jsprowotstat.ru/cron.php?user=admin&pass=123456

Проблема: Задача не выполняется.
В ручном режиме, по команде:
http://jsprowotstat.ru/cron.php?user=admin&pass=123456 обновление работает
Помогите пожалуйста!

09.09.2013, 23:01 #3
Меню пользователя RVS1974
Посмотреть профиль
Отправить личное сообщение для RVS1974
Найти ещё сообщения от RVS1974
10.09.2013, 08:48 #4
Меню пользователя timtowtdi
Посмотреть профиль
Отправить личное сообщение для timtowtdi
Найти ещё сообщения от timtowtdi

в общем, настроил cron c csvi так:
/usr/local/bin/php -c /home/идентификаторхостинга/etc/ /home/идентификаторхостинга/имясайта/docs/administrator/components/com_csvi/helpers/cron.php username=admin passwd=admin template_
внимание!
/libraries/joomla/database/database/mysqli.php on line 190
Почему то крон не захотел работать с mysqli, пришлось в configuration.php сменить на mysql.
Далее была проблема с авторизацией в csvi. Пришлось закоментить пару строк
administrator/components/com_csvi/csvi.php
// Access check.
//if (!JFactory::getUser()->authorise(core.manage, com_csvi)) <
//$jinput = JFactory::getApplication()->input,
//$cron = $jinput->get(cron, false, bool),
//if ($cron) <
// echo JText::_(JERROR_ALERTNOAUTHOR)./n,
// return false,
//>
//else return JError::raiseWarning(404, JText::_(JERROR_ALERTNOAUTHOR)),
//>

После данных операций, я не отвечаю за безопасность вашего сайта. И сам в поисках других путей исправления ошибок.

17.02.2015, 20:05 #5
Меню пользователя simus245
Посмотреть профиль
Отправить личное сообщение для simus245
Найти ещё сообщения от simus245
17.02.2015, 20:21 #6
Меню пользователя nel-finger
Посмотреть профиль
Отправить личное сообщение для nel-finger
Посетить домашнюю страницу nel-finger
Найти ещё сообщения от nel-finger

читал и не раз.
сама тех поддержка предложила вот такой вариант.
/usr/local/bin/php -c /home/идентификаторхостинга/etc/ /home/идентификаторхостинга/имясайта/docs/administrator/components/com_csvi/helpers/cron.php -- username=admin passwd=admin template_ > но при этом варианте вход на сайт не происходил. Была надпись логин и пароль неверные, вход не выполнен.
так же пробовал запустить крон через wget как написанно в хелпе. в строке браузера всё заходило нормально, при этом в кроне была ошибка которую видно тоько в логах, которые в свою очередь, хостинг предоставляет по запросу, в течении недели.

Если у вас есть готовый вариант решения этого вопроса, прошу, не стесняйтесь, скидывайте!

18.02.2015, 10:25 #7
Меню пользователя simus245
Посмотреть профиль
Отправить личное сообщение для simus245
Найти ещё сообщения от simus245
18.02.2015, 10:33 #8
/usr/local/bin/php -c /home/идентификаторхостинга/etc/ /home/идентификаторхостинга/имясайта/docs/administrator/components/com_csvi/helpers/cron.php -- username=admin passwd=admin template_ >

См. инструкцию http://hosting.nic.ru/support/cron.shtml, для Вашего случая см. абзац Запуск php-скриптов с параметрами

Меню пользователя Станислав Муравьев
Посмотреть профиль
Найти ещё сообщения от Станислав Муравьев

См. инструкцию http://hosting.nic.ru/support/cron.shtml, для Вашего случая см. абзац Запуск php-скриптов с параметрами

3. Примеры настройки заданий

Для запуска php-скрипта можно воспользоваться следующей командой:

cd $HOME/папка_сайта/docs/папка_скрипта/ && /opt/php/bin/php -c $HOME/etc/php.ini $HOME/папка_сайта/docs/папка_скрипта/имя_скрипта.php

вы имеете ввиду эту команду? Если да, то как правильно указать параметры для входа и открытия шаблона для выполнения, в моём случае template_id
--------------------------------------------------------------------------------------
Запуск php-скриптов с параметрами

/usr/local/bin/wget -O - -q http://nic.ru/cron.php?var1=xxx&var2=yyy

Здесь:
/usr/local/bin/wget — путь к программе wget,
http://nic.ru/cron.php?var1=xxx&var2=yyy — адрес скрипта с параметрами.

если вы имели ввиду вот так, то я именно так и делал в самом первом варианте, но крон не работал и ябратился в тех. поддержку по телефону 8800, по телефону тех. поддержка сказала сделать именно так как я описал выше
/usr/local/bin/php -c /home/идентификаторхостинга/etc/ /home/идентификаторхостинга/имясайта/docs/administrator/components/com_csvi/helpers/cron.php -- username=admin passwd=admin template_ > причём с wget, ссылка указанная в кавычках http://nic.ru/cron.php?var1=xxx&var2=yyy, в моём случае ссылка до моего крона(cron.php в компоненте csvi), вставленная в браузер опера 12 срабатывала нормально, но на хостинге данный вариант не сработал, так же ссылка не сработала в хроме ссылаясь на неправильную авторизацию.

18.02.2015, 15:04 #9
Меню пользователя simus245
Посмотреть профиль
Отправить личное сообщение для simus245
Найти ещё сообщения от simus245

Для Вашего скрипта единственный путь - запрашивать адрес через браузер. То есть запрос с wget в Вашем случае - единственно верное решение. Настройте, пожалуйста, планировщик задач в соответствии с рекомендациями Запуск php-скриптов с параметрами. Если что-то не получится, не меняя настроек, обратитесь, пожалуйста, в техподдержку через раздел Сообщения панели управления хостингом или по электронной почте.

WP Cron (планировщик) в WordPress

Представим что нам нужно, чтобы через 5 часов выполнилась какая-то PHP функция или чтобы эта функция выполнялась каждый день. В решении такой задачи нам поможет WordPress Крон — планировщик задач. Давайте разберемся как он работает и как его использовать.

Название Cron взято из UNIX-подобных операционных систем. Там Cron — это планировщик заданий в задачу которого входит периодическое выполнение указанных действий в определённое время.

Kama_Cron — маленький класс для удобной работы с Кроном WordPress.

Крон задачи самого WordPress

WordPress использует крон для своих нужд, так в нем есть базовые крон задачи:

  • Проверка обновлений для плагинов, тем, переводов и ядра (два раза в день).
    • wp_version_check → wp_version_check()
    • wp_update_plugins → wp_update_plugins()
    • wp_update_themes → wp_update_themes()
  • Удаление комментариев и записей из корзины (раз в день).
    • wp_scheduled_delete → wp_scheduled_delete()
  • Удаление просроченных временных опций (раз в день).
    • delete_expired_transients → delete_expired_transients()
  • Удаление черновиков (auto-draft) (раз в день).
    • wp_scheduled_auto_draft_delete → wp_delete_auto_drafts()
  • Удаление старых файлов экспорта (раз в день) (с WP 4.9.6)
    • wp_privacy_delete_old_export_files → wp_privacy_delete_old_export_files()
меню

Как работает крон (шаг за шагом)

При посещении любой страницы сайта (при любом запросе к сайту), в том числе при AJAX, REST запросах, т.е. всегда на событии init срабатывает функция wp_cron() .

wp_cron() проверяет существует ли хоть одно задание с подошедшем временем. Если есть, то вызывает функцию spawn_cron() .

spawn_cron() запускает крон! Отправляет не блокирующий HTTP запрос на файл крона /wp-cron.php в котором передает текущую метку времени вида: microtime(true) , например: 1538326680.8330409526824951171875 .

Тут проверяется, когда был в последний раз запущен крон, если менее 60 секунд, то функция ничего не делает. Изменить этот интервал можно через константу define( WP_CRON_LOCK_TIMEOUT, 60 ) , указать в константе можно максимум 600 (10 минут), если указать больше, то она будет игнорироваться.

Далее проверяется есть ли хоть одно подошедшее задание, если есть то во временную опцию doing_cron записывается текущая метка времени, когда был запущен крон и отправляется неблокирующий запрос на файл /wp-cron.php , там эта метка времени используется для разных проверок.

Файл /wp-cron.php опять проверяет: не запускался ли недавно крон (менее 60 сек назад), есть ли подошедшие крон задания.

Далее, проходит по всем «поспевшим» задачам и для каждого из них: удаляет текущую задачу из расписания, и если у задачи есть метка schedule , (оно повторяющееся), создает новое такое же задание с помощью функции wp_reschedule_event(). Новое задание будет выполнено через указанный в интервале промежуток времени.

Далее, запускается указанный при регистрации крон задачи хук-событие, т.е. запускается текущее задание:

Если обращаться к файлу /wp-cron.php напрямую, то он будет отрабатывать только раз в WP_CRON_LOCK_TIMEOUT секунд (60 секунд).

Если в кроне много заданий и одно задание начало выполняться и выполняется так долго, что уже был отправлен очередной запрос на выполнение заданий крон, то очередная задача в первом крон запросе НЕ будет выполнена — первый запрос просто остановится после выполнения «долгой» задачи и очередные задания уже будут выполняться во втором запросе.

Заметки

Все крон задачи хранятся в опции get_option( cron ) .

Крон запрос запускается отдельно от текущей загрузки страницы и в нем отдельно грузится среда ВП и т.д. Текущий запрос (посещение страницы) только инициализирует крон (создает запрос на файл крона), если время подошло.

Другими словами: крон задачи выполняются асинхронно. Т.е. для выполнения ожидаемых крон задач, WordPress отправляет запрос на файл http://example.com/wp-cron.php . Этот файл самодостаточный: он устанавливает константу define(DOING_CRON, true) , затем подгружает среду WordPress и выполняет все ожидаемые задачи.

Работает ли крон на сайте, как проверить?

Быстрый способ убедиться что крон исправно работает — это опубликовать запись с датой позже текущей (она будет поставлена в очередь на публикацию) и посмотреть опубликуется она или нет.

Если крон работает, то запись просто опубликуется в заданное время. А если крон не работает, то мы увидим такую картину:

Крон может не работать по двум причинам:

  • Он отключен. Как отключать смотрите ниже.
  • Ваш сервер не умеет отправлять HTTP запросы. Крон активируется через неблокирующий HTTP запрос WP к самому себе.
меню

Альтернативный вариант инициализации крона

По умолчанию крон запускается POST запросом, с помощью wp_remote_post() . Но если у вас на сервере такой вариант не работает, то можно включить альтернативный вариант запуска крона. Для этого добавьте такую константу в файл wp-config.php :

Такой альтернативный запуск крона создаст запрос через wp_redirect() , т.е. запрос будет отправлен не из PHP, а клиентом (браузером). Подробнее см. spawn_cron().

Как отключить крон?

Чтобы отключить крон, нужно зайти в файл wp-config.php и добавить туда следующую строчку:

Отключать крон крайне не рекомендуется, потому что через него WordPress чистит за собой всякие черновики и удаляет записи из корзины, также на базе крона могут работать некоторые плагины!

wp_schedule_event( $timestamp, $recurrence, $hook, $args ) Создает многоразовую крон-задачу. Устанавливает хук, который будет вызываться каждый раз через указанный интервал времени. wp_schedule_single_event( $timestamp, $hook, $args ) Создает одноразовую крон-задачу. Устанавливает хук, который будет вызван всего один раз в указанное время.

wp_unschedule_event( $timestamp, $hook, $args ) Удаляет конкретную крон-задачу. Для удаления нужно знать все 3 параметра. wp_clear_scheduled_hook( $hook, $args ) Отменяет (удаляет) запланированные cron задания по указанному имени хука и передаваемым параметрам. Работает на основе wp_unschedule_event() . wp_unschedule_hook( $hook ) Удаляет из расписания крон абсолютно все крон задачи по указанному хуку. Тут не важно какие параметры были указаны при регистрации задачи.

wp_next_scheduled( $hook, $args ) Возвращает метку времени (timestamp) когда должно сработать следующее по расписанию cron задание. Позволяет проверить есть ли в крон указанное задание. wp_doing_cron() Определяет является ли текущий запрос, запросом к Крону. Условный тег. wp_get_schedules( ) Получает поддерживаемые Cron интервалы времени.

Весь список смотрите по этой ссылке.

Создание крон задач

Для создания новых крон задач используется одна из функций: wp_schedule_event() или wp_schedule_single_event() .

Вызывать функции создания крон задач нужно только один раз! Обычно это делается при активации плагина, а при деактивации эти крон задачи нужно удалять. Или можно сначала проверить нет ли уже указанной крон задачи, если нет, то добавить.

При вызове функции регистрации задачи она записывается в опцию сайта cron и работает уже от туда автономно.

Если задача есть в кроне, но она не срабатывает, значит во время крон запроса не подключается хук. Например, если выставлять задачу wp_schedule_single_event() через AJAX запрос и там же регистрировать хук этой задачи, то задача будет зарегистрирована в кроне, но функция в нужный момент выполняться не будет, потому что хук на который повешена функция срабатывает при AJAX запросе, а должен срабатывать при крон запросе! Поэтому сам хук нужно вешать в functions.php или в плагин или как-то еще, но не во время обработки аякс запроса.

Если при добавлении крон задачи, в планировщике уже есть задача с таким же названием и аргументами и время новой задачи не превышает 10 минут от времени имеющийся, то добавление новой крон-задачи будет проигнорировано.

Суть этого в том, чтобы не допустить планирования двух одинаковых событий в течение десяти минут друг от друга, но не препятствовать планированию одинаковых событий с разницей во времени больше десяти минут друг от друга.

События считаются одинаковыми, если совпадают: название хука и передаваемые параметры.

#1 Создаем крон задачу при активации плагина

Запланируем ежечасное действие для плагина. Для этого вызовем wp_schedule_event() при активации плагина (если делать не при активации, то мы получим множество запланированных событий!).

#2 Создаем крон задачу если её еще нет

Этот пример не полагается на активацию плагина (через директорию плагинов), вместо этого он добавляет событие, если его не существует.

Минус этого кода в том, что проверка происходит всегда при всех запросах, а добавляется задача всего один раз. Однако PHP затраты тут мизерные, сравнимые с обычным получением опции get_option() , поэтому на это можно закрыть глаза в угоду удобству.

Смотрите в описании функции wp_schedule_event().

#1 Запланируем событие через час с текущего момента

Интервалы для крон задач

Крон интервалы нужны, чтобы они были и затем их можно было использовать при пере-регистрации крон-задачи.

По умолчанию в WP три интервала:

Добавлять новый интервал Cron нужно через фильтр cron_schedules .

Добавим интервал «5 минут» (делать что-либо каждые 5 минут):

Код создания интервала должен срабатывать всегда, так как данные об интервалах не хранятся в базе данных, а используются они постоянно. При выполнении одной крон задачи, WP создает такое же задание, а метку времени этого нового задания вычисляет на основе указанного имени интервала. И поэтому данные интервала нужны всегда!

Казалось бы почему просто не указать интервал при добавлении задачи и все, зачем нужно добавлять интервал через фильтр. Дело в том, что один и тот же интервал могут использовать разные крон задачи.

Теперь можно использовать этот интервал при создании крон-задачи:

Константы WordPress которые могут пригодится при создании крон интервала:

  • HOUR_IN_SECONDS - час в секундах - 60*60 = 3600
  • DAY_IN_SECONDS - день в секундах - 60*60*24 = 86400
  • WEEK_IN_SECONDS - неделя в секундах - 60*60*24*7 = 604800

Удаление крон задач

Для удаления крон задач есть 3 функции:

Удаляет конкретную крон-задачу. Для удаления нужно знать все 3 параметра: метку времени, хук, передаваемые параметры.

Заметка: если параметр не передается, то его соответственно можно не указывать.

Удаляет все крон-задачи прикрепленные к указанному хуку и имеющие указанные параметры.

Удаляет абсолютно все крон-задачи, прикрепленные к указанному хуку, неважно какая метка времени или какие передаются параметры.

Наглядно, как работают функции:

wp_unschedule_event( $timestamp, $hook, $args )

wp_clear_scheduled_hook( $hook, $args )

Дебаг Крона в WordPress

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

Для дебага крон функции нужно напрямую обращаться к файлу http://example.com/wp-cron.php . Или можно оттестировать функцию крона отдельно, и потом просто повесить её на хук крона и убедится что хук сработал в нужное время.

Чтобы увидеть ошибки (если они есть), нужно поставить интервал поменьше (чтобы поймать выполнение нашего задания) и перейти по уже упомянутой ссылке http://example.com/wp-cron.php .

Обращаясь к файлу wp-cron.php напрямую, вы будите насильно инициализировать запуск крона WordPress и увидите, что возвращают ваши функции, если наступило время их выполнения. В том числе можно будет увидеть PHP ошибки, если включена константа WP_DEBUG в wp-config.php .

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

Для отключения крона добавьте в wp-config.php такую константу:

Получить весь список текущих крон задач можно функцией _get_cron_array() :

Отзывы

Карп
rejukosmaths1986
Селиверст
Ефрем
Казимира

Написать отзыв

Success! Your message has been sent.

18.02.2015, 15:22 #10