В рамках программы "Ликбез"
Специально для vBSupport.org
Это обзор для тех, кто только начинает осваивать движок, или никогда не задумывался, что такое "Запланированные задачи" и что за зверь cronimage.
Те, кто сам пишет хаки с собственными кронами, могут с чистой совестью закрыть вкладку
Или дополнить обзор конкретными примерами конкретных задач.
Очень популярно, очень простыми словами.
Давайте для начала ответим на вопрос: что делает форум? "Форум" как движок, а не только место общения по интересам.
Итак...
Форум хранит данные о зарегистрированных (пароли, явки, адреса)
форум считает, сколько кто постов набил
у кого сколько баллов репутации
и умеет по заданным параметрам переводить юзеров из одной группы в другую.
Параметры эти задаются в админке, где-то там, где "Повышения пользователей"
Форум считает, сколько раз просмотрели тему
сколько раз скачали вложение
Форум проверяет, не истёк ли срок пребывания в бане временно заблокированных юзеров
и если истёк - возвращает их из бани
А сколько писем отправляет форум своим верным юзерам... уууууу......
это и подписки на темы/разделы
это и напоминания о событиях - тем, кто умеет пользоваться календарём
это и поздравления с днём рождения
это и напоминания об активации по электронной почте
А сколько работы проводит форум тихо, незаметно...
например, проверяет вложения - точно ли они закреплены за конкретным постом? и если не закреплены - тихо удаляет этот ненужный и неиспользуемый хлам
Оффтоп
последнее относится к тройке - на 100%, а к 4ке - нуууу... выборочно) к тем версиям, где разрабы не отломали эту функцию
Как видим, форум выполняет тяжёлую работу, результаты которой не всегда сразу заметны.
И если что-то сломалось - это тоже не всегда сразу заметно
Как правило, чаще всего юзера/админы замечают, что не обновляются счётчики просмотров тем
Счётчик показывает цифру, равную количеству ответов в теме + 1
И, как правило, многие админы идут в админку, находят пункт "Обновление счётчика просмотра темы" и переключают его на "немедленно"
Так же, как и с "Обновлять счётчик просмотра вложений немедленно"
Это в корне неверно!
Лечить нужно причину, а не следствие.
Прежде всего, следует отметить, что невыполнение любой из перечисленных в списке задач может иметь причиной не только невыполнение крон-задач... "тут возможно наличие более, чем одной неисправности"©
Но, поскольку мы говорим о кроне - будем акцентировать внимание только на нём.
Крон-задачи выполняются при условиях:
- переменная присутствует в шаблоне
- на форум таки заходят не только боты, но и люди
На закрытом форуме запланированные задачи нЕ выполняются
Если вы вдруг заметили, что что-то из перечисленного выше нЕ выполняется, вам следует проверить, а не удалён ли случайно вызов крона из шаблона.
Админка - Стили и шаблоны - дальше как угодно, хоть поиском в шаблонах, хоть через "управление стилями - общие шаблоны" - откройте футер - footer.
У вас
обязательно должен присутствовать в футере вот такой код:
HTML Code:
<!-- Do not remove cronimage or your scheduled tasks will cease to function -->
$cronimage
<!-- Do not remove cronimage or your scheduled tasks will cease to function -->
Для 4ки:
HTML Code:
<!-- Do not remove cronimage or your scheduled tasks will cease to function -->
{vb:raw cronimage}
<!-- Do not remove cronimage or your scheduled tasks will cease to function -->
в 5ке... всё
вообще нЕ так, и не будем о ней...
комментарии здесь особого значения не имеют, главное, чтобы переменная $cronimage была
Пользуясь случаем, обращаю внимание новоиспеченных админов:
если вы не понимаете, что это за кусок кода в шаблоне - ну
не трогайте вы его!!!!
Не трогайте лишний раз даже комментарии в шаблонах, ибо есть хаки, которые цепляются именно к комментариям. Это не говоря уж о том, что комменты написаны там не от балды, а для облегчения понимания...
Идём дальше. Вы убедились, что $cronimage в футере присутствует, но задачи не выполняются.
NEW !!! Поднимите глаза чуть выше строки <!-- Do not remove cronimage... и посмотрите, а не взят ли весь этот кусок в какое-то условие?
пример: стиль Cyborg Dark (Orange Black v2)
этот кусок футера:
HTML Code:
<if condition="$vboptions[copyrighttext]">
<tr>
<td class="alt1" align="center">
<!-- Do not remove $cronimage or your scheduled tasks will cease to function -->
$cronimage
<!-- Do not remove $cronimage or your scheduled tasks will cease to function -->
$vboptions[copyrighttext]
</td>
</tr>
</if>
То есть, если в админке не прописан копирайттекст - условие не выполнено, крон не срабатывает
вынимайте $cronimage из условий или прописывайте копирайттекст
Условий нет? - идём дальше...
Админка - Запланированные задачи - Управление задачами.
Здесь мы видим список всех запланированных задач, которые должен выполнять движок.
Штатная визуализация: если заголовок перечёркнут, значит, задача выключена.
Выключены могут быть крон-задачи, добавленные хаками, если этот хак в данный момент отключен как продукт.
Все остальные кроны нЕ должны быть зачёркнуты, возле активной задачи стоит галочка в чекбоксе.
Прочитайте список. Возможно, кто-то когда-то по неосмотретильности выключил какую-то задачу.
Ежели вдруг такое обнаружится - включите задачу, либо из выпадающего меню - включить, либо проставьте галочку в чекбокс и нажмите "Сохранить статус"
Список штатных запланированных задач:
Ежечасная очистка
Этот скрипт ежечасно производит разнообразные очистки.
Ежечасная очистка #2
Этот скрипт ежечасно производит разнообразные очистки.
Проверка на возврат денег в CCBill
Этот скрипт требуется только в том случае, если вы включили управление платежами через CCBill. Скрипт связывается с сервером CCBill и проверяет наличие возвратов платежей, обновляя, при наличии таковых, список подписчиков.
Просмотры вложений
Этот скрипт обновляет количество просмотров вложений раз в час, если в настройках установлена задержка. Это весьма полезно для форумов с большим количеством вложений или пользователей.
Счётчики просмотров тем
Этот скрипт ежечасно обновляет количество просмотров тем. Эта опция весьма необходима для форумов с большим количеством тем или пользователей.
Поддержка RSS
Этот скрипт считывает RSS ленты из интернета и вставляет их на ваш форум в виде новых тем или объявлений.
Восстановление временно заблокированных пользователей
Этот скрипт ежечасно возвращает доступ временно заблокированным пользователям.
Очистка нарушений
Удаляет устаревшие нарушения дважды в час.
Напоминания о событиях
Этот скрипт рассылает напоминания о событиях из календаря дважды в час.
Повышения пользователей
Этот скрипт производит повышения пользователей раз в час.
Запись статистики
Этот скрипт ежечасно обновляет статистику. В панели администратора находятся данные статистики о новых пользователях, новых темах, новых сообщениях и активных пользователях.
Дни рождения
Отправляет пользователям электронное письмо с поздравлением на день рождения.
Ежедневный обзор
Этот скрипт производит ежедневную рассылку обзора новых тем и сообщений.
Подписки
Этот скрипт ежедневно удаляет истёкшие платные подписки и рассылает пользователям уведомления о скором истечении срока подписки.
Напоминания об активации по электронной почте
Этот скрипт отсылает напоминания пользователям, ожидающим подтверждения по электронной почте. Электронное письмо отправляется раз в сутки с момента регистрации пользователя. При отсутствии ответов в течении 5 дней рассылка прекращается.
Ежедневная очистка
Этот скрипт ежедневно производит разнообразные очистки.
Еженедельный обзор
Этот скрипт производит еженедельную рассылку обзора новых тем и сообщений.
//Список - для тройки! Для 4ки, в общем, то же самое. Если сьют - там добавляется ежедневная очистка для CMS и несколько задач для блогов//
Если в вашем списке запланированных задач вы не увидели чего-то из приведенного списка...
то, во-первых, хорошо бы выяснить, кто удалил задачу и надавать по рукам...
во-вторых, задачу нужно добавить
Там же, Админка - Запланированные задачи - Управление задачами - жмём "Добавить новую задачу"... ну и, наверное, спрашиваем в этой теме, как восстановить конкретную задачу, ибо не вижу смысла расписывать подробности для всех существующих задач...
Дальше...
если вы зашли в Админка - Запланированные задачи - Управление задачами, сравнили список и убедились, что все задачи на месте, все включены; более того, в колонке "Следующий раз" стоит дата не прошлого столетия, а сегодняшнее число (время, час:мин может быть уже прошедшее, на неактивном форуме такое бывает) - следует проверить ещё один момент.
Откройте дистрибутив includes/cron - это отдельные файлики для каждой отдельной задачи.
Идите к себе на фтп, includes/cron и сравнивайте список
Как ни парадоксально это звучит - да, может быть так, что отсутствует какой-то файл крона, но никаких ошибок не выводится
Если обнаружили пропажу файла - ессно, залейте его... а лучше просто перезалейте все файлы - если есть подозрение, что какой-то файл мог быть повреждён
===
По крону - это, пожалуй, всё
Если всё проверили, всё на месте, но проблема осталась - значит, искать нужно в другом месте.
Небольшой блиц возможных проблем.
Не отсылаются уведомления о подписках, напоминания-поздравления-прочее: проверяем настройки почты
Не снимаются нарушения - смотрим настройки нарушений, внимательно и вдумчиво, скорее всего, там что-то неправильно прописано
Не происходит разблокировка временно заблокированных пользователей - аналогично предыдущему пункту, курим настройки баллов нарушений и автоблокировки
Не происходят повышения пользователей:
1. Внимательно проверяем настройки повышений
2. Имейте в виду, повышения просчитываются только для активных пользователей. "Активных" здесь - не дефолтные 30 дней. В целях экономии и оптимизации разработчики проверяют только юзеров, у которых активность была со времени lastrun (последнего запуска) запланированной задачи. То есть, грубо говоря, юзер должен зайти на форум, тогда ближайший крон его повысит.
В том экзотическом случае, когда Вы видите, что юзеру повысили репу, и хотите сделать ему приятное - чтобы он сразу увидел повышение (экстра-экзотический случай: если Вы предполагаете, что юзер чаще ходит по форуму гостем... или
обиделся и ждёт, пока ему репу натычут и повысят...) - ну... смените ему группу вручную.
Оффтоп
и нечего хихикать над "экзотикой"... все примеры - только из жизни
Не обновляются счётчики просмотров тем/вложений:
Это отдельная проблема. Частая проблема, кстати. Настолько частая, что считаю необходимым ещё раз написать решение.
Зайдите в ПМА - phpmyadmin - и посмотрите, не плодятся ли у вас таблицы с названиями aaggregate и taggregate (это штатные, кроме них - счётчики просмотров блогов, например, тоже создают аналогичные таблицы)
Если да, плодятся, их уже десятки, сотни - проверьте наличие таблиц threadviews, attachmentviews, (blog_views, если установлены блоги) и выполните диагностику этих таблиц.
Повреждение таблицы attachmentviews плодит aaggregate_temp_, повреждение threadviews соответственно taggregate_temp_
Вообще при отсутствии/повреждении таблиц вас должно бы завалить на почту сообщениями об ошибке базы данных)
Восстановите повреждённую таблицу (создайте заново, все данные - в файле install/mysql-schema.php)
Все временные aggregate - удаляйте
подробности про ошибки БД - в этой теме:
Ошибка БД - Database error
===
Возвращаемся к крон-задачам.
Вопрос-ответ:
По какому принципу запланированные задачи выполняются именно с такими промежутками?
//меня слегка ставит в тупик этот вопрос//
Задачи "размазаны" по времени на 24 часа, и в течение часа - разные задачи вызываются в среднем с пятиминутным промежутком
что-то выполняется чаще, что-то реже
При этом разработчики ориентировались на среднестатистический форум, особенно по посещаемости в течение суток. Объёмные задачи, такие, как ежедневный обзор или рассылка поздравлений с ДР вынесены на ночное время. Причём, очень разумно, не на два-три ночи, когда все нормальные спят сном праведников, а на полночь, когда юзера ещё заходят на форум, но основная нагрузка уже схлынула.
Логично?
Весьма.
и тогда - следующий вопрос:
А у меня сервер - в америках, а юзера - из СНГ, может быть, мне нужно переставить время выполнения задач?
Ну, раз вопрос формулируется "может быть", значит, острой необходимости - нет)
Читал accesslog. Увидел странность: обращение к cron.php бывает подряд много раз, и цифра, например, cron.php?rand=1327575467 повторяется одна и та же, много раз. Это плохо?
Чтение логов - занятие увлекательное и очень полезное. Но полезнее, всё же, читать не access, а error.log
Почему вызывается один и тот же rand? Да, такое бывает, и не редко, особенно на посещаемых форумах. Пришло время выполнения очередной задачи, и несколько юзеров как раз ткнулись в какие-то страницы. С учётом того, что $cronimage находится в футере; время загрузки страницы у юзеров - разное; страница может быть перегружена всякими сайдбарами, и время генерации страницы - тоже не мгновенно, то юзерам совсем не обязательно заранее сговариваться и тыкать в темы на раз-два-три.
Не заморачивайтесь. Следующий rand, через пять минут, был уже с другой цифрой? значит, всё нормально.
Если уж зуд в руках и так хочется что-то сделать, можете попробовать переместить вызов крона из футера куда-нибудь повыше. Скажем, в хедер.
Хостер читал мой accesslog. Увидел множество обращений к одному файлу, cron.php, и требует, чтобы я оптимизировал работу скриптов.
Оффтоп
Повторяю: нечего хихикать, все примеры - только из жизни
Какой хороший хостер... беспокоится...
Обычно в таких случаях я рекомендую просветить хостера, что с тех пор, как были изобретены сайты а-ля простая хтмл-страничка, прогресс шагнул далеко вперёд. И обычно это мало помогает)
Так же мало помогают объяснения, что просто вызов крона не грузит сервер, всё зависит от того, какую конкретно задачу запускает крон.
Впрочем, если хостер хочет быть полезным - пусть настроит системный крон. Тогда вызов переменной из футера можно будет удалить. Задачи будут вызываться не бессистемно шляющимися по форуму посетителями, а строго по расписанию.
Ссылка
Я подписан на все разделы, у меня везде проставлено уведомление о новых темах/сообщениях в разделе. На почту ничего не пришло, захожу на форум - боты заспамили весь форум! Начал чистить - поприходили уведомления и о новых темах, и о новых ЛС. Почему так? Почему уведомления не пришли сразу?
Потому что боты - нЕ люди, и ходят не с браузеров, и крон не вызывают. Значит, Вы - первый, кто после набега ботов зашёл на форум с браузера. Поскольку нет стопроцентного способа привлечь постоянно присутствующих на форуме людей, займитесь борьбой с ботами. Статья:
Методы борьбы со спам ботами
Поставил хак, он должен делать то-то и то-то, но он как-то странно работает, задачи то выполняются, то нет.
Бывает, что разработчики хаков ошибаются при составлении крон-задачи. Посмотрите в Админка - Запланированные задачи - Управление задачами
Верх таблички, буквы
м ч Д М ДН
минута
час
День
Месяц
День Недели
Задача со скрина выполняется на 59й минуте каждого часа, каждый день
Смотрим другие примеры задач:
Первая, подчёркнутая зелёным: выполняется в 0 часов 10 минут каждый день
Вторая - попробуйте прочесть самостоятельно, прежде чем раскрыть ответ
ответ
в 0 часов 30 минут по понедельникам
Прочли правильно? Отлично! идём дальше.
Подчёркнутое синим: здесь всё верно?
ответ
задача выполняется каждую минуту каждого часа, каждый день. Чисто теоретически - такое допустимо, зависит от самой задачи. Принципиальной ошибки здесь нет, вопрос только в нагрузке.
Подчёркнутое красным:
ответ
задача выполняется каждую минуту десятого часа. Все остальные часы в сутках она не вызывается. То есть, один час в сутки она долбит сервер каждую минуту, потом уходит в спячку. Это пример некорректно составленной задачи.
Если Вы обнаружили проблему с выполнением задач конкретного продукта, не забудьте поставить разработчика в известность.
Так же напоминаю: полезно подписываться на тему с хаком, если Вы его установили - чтобы не пропустить обновления/фиксы.
===
Статья по возможности будет дополняться.