VBsupport перешел с домена .ORG на родной .RU
Ура!
Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей
Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже: Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота. Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
В общем сабж.
Есть некоторые крон задачи, которые отрабатывают не до конца, ни ошибок, ни предупреждений в логах нет.
Например, повышения пользователей. Каждый час отрабатывают повышения (судя по логам крона в админке) для 2 или 3 пользователей. но если запустить сразу после этого крон задачу из админки, то найдется еще 2 или 3 пользователя для которых повышение не отработало. Как следствие за день набирается около 20 пользователей для которых не отработало повышение.
Заметил что такие проблемы возникают для любых тяжелых крон задач (по cpu и по времени), но из админки ведь отрабатывает нормально, а по обычному крону нет...
В шаблонах крон везде есть (если бы не было - то не работал бы вообще).
Судя по форуму на vbulletin.org подобная проблема встречается на версиях 3.6, 3.7 и 3.8 (может и на более ранних, но на 3.6 - 3.8 точно), но вразумительного ответа так никто и не дал.
Может кто встречался с такой проблемой? Потому что похоже такая проблема была и здесь одно время - один знакомый сказал что его переносило по повышению с полмесяца в новую группу (может и не из-за крона, но все-таки очень похожий симптом).
P.S. Судя по коду крона - его никто не правил очень давно или специально оставили недокументированную возможность использовать системный крон (настройка булки $vbulletin->options['crontab'], код в исходниках крона есть, но самой настройки нет, т.е. если ее добавить в админку, то можно использовать cli режим php и системный крон)
Last edited by Yoskaldyr : 08-22-2009 at 02:48 PM.
Согласен vb 3.8.2 RSS импорт по крону не работает. Приходится в ручную запускать
@Yoskaldyr
Специалист
Join Date: Jan 2007
Posts: 543
Версия vB: 4.0.x
Reputation:
Professional 556
Репутация в разделе: 255
0
Да... Видать мало крупных форумов (на небольших такая проблема не проявляется)
Придется переписывать крон, сравнивать с тем как задачи из админки запускаются...
@netwind
Гуру
Join Date: Aug 2005
Location: Рiдна Олбанея
Posts: 3,844
Версия vB: 3.8.x
Reputation:
Гуру 1227
Репутация в разделе: 901
0
Переписывайте. Но этой проблемы на крупных форумах нет.
@Yoskaldyr
Специалист
Join Date: Jan 2007
Posts: 543
Версия vB: 4.0.x
Reputation:
Professional 556
Репутация в разделе: 255
2
Quote:
Originally Posted by netwind
Переписывайте. Но этой проблемы на крупных форумах нет.
Видать не так выразился... Это плавающая проблема - и на небольшом форуме ее 100% не будет. На крупных появляется и то редко, просто на офф.форуме vbulletin у тех у кого она появляется, никто не описал конфиг сервера, поэтому нельзя выявить хоть какую либо зависимость.
Yoskaldyr добавил 25.08.2009 в 15:32
Как я и предполагал ошибка в коде (иногда просто удивляюсь как разрабы желсофта гонят)
Типичная логическая ошибка разработки программы и как оказалось не в самом кроне а файле повышений пользователей promotion.php. Этот код будет правильно работать только если крон булки прикрепить к системному крону и то будет очень небольшая вероятность что не отработают некоторые пользователи.
PHP Code:
$promotions = $vbulletin->db->query_read(" SELECT user.joindate, user.userid, user.membergroupids, user.posts, user.reputation, user.usergroupid, user.displaygroupid, user.customtitle, user.username, user.ipoints, userpromotion.joinusergroupid, userpromotion.reputation AS jumpreputation, userpromotion.posts AS jumpposts, userpromotion.date AS jumpdate, userpromotion.type, userpromotion.strategy, usergroup.title, usergroup.usertitle AS ug_usertitle, usertextfield.rank FROM " . TABLE_PREFIX . "user AS user INNER JOIN " . TABLE_PREFIX . "userpromotion AS userpromotion ON (user.usergroupid = userpromotion.usergroupid) LEFT JOIN " . TABLE_PREFIX . "usergroup AS usergroup ON (userpromotion.joinusergroupid = usergroup.usergroupid) LEFT JOIN " . TABLE_PREFIX . "usertextfield AS usertextfield ON (usertextfield.userid = user.userid) " . iif(VB_AREA != 'AdminCP', "WHERE user.lastactivity >= " . (TIMENOW - ($nextrun - TIMENOW))) );
Конечно понятно, что не удобно из логов крона брать точное время предыдущей успешной отработки данной задачи, но так точно рассчитывать и без минимальной погрешности... А если еще время задач будет изменено на не равные интервалы времени (а не как по умолчанию раз в час), то тогда вообще может у больше половины пользователей не отработают повышения.
более детально в данный момент смотреть код и базу не хочу, решение ниже, сделанное на коленке - просто добавление небольшого запаса по точности, последние строчки будут выглядеть так:
Значение 1.1 можно увеличить при низкой посещаемости форума до 1.5
P.S. Понятно что это немного утяжелит задание, но зато все повышения пройдут и не надо вручную запускать в админке
Yoskaldyr добавил 25.08.2009 в 15:38
Раз есть ошибка в повышениях пользователей, то и в других крон задачах могут быть подобные косяки
не стоит понимать буквально, смысл выражения TIMENOW - intval(1.1*($nextrun - TIMENOW))) в том чтобы гарантированно захватить период прошлого успешного запуска данной задачи и это должен решать сам админ исходя из посещаемости форума и частоты отработки крона (например, крон не всегда может отработать из-за неправильной обработки заголовков No-Cache браузером или проксей), также крон не отработает при каких либо ajax функциях (но отработает lastactivity для пользователя) - так как нет обновления страницы и как результат нет обращения к cron.php. Более точно частоту обращений к cron.php нужно смотреть по логам вебсервера. Т.е. условие в некоторых частных случаях может выглядеть и так:
Last edited by Yoskaldyr : 08-26-2009 at 02:44 PM.
Reason: Добавлено сообщение
@netwind
Гуру
Join Date: Aug 2005
Location: Рiдна Олбанея
Posts: 3,844
Версия vB: 3.8.x
Reputation:
Гуру 1227
Репутация в разделе: 901
0
Quote:
Originally Posted by Yoskaldyr
А если еще время задач будет изменено на не равные интервалы времени (а не как по умолчанию раз в час)
все ясно. в багтрекере обычно такое кончается вердиктом "work as designed" (переводиться обычно как "сам дурак").
попробуй запостить ради интереса.
@Yoskaldyr
Специалист
Join Date: Jan 2007
Posts: 543
Версия vB: 4.0.x
Reputation:
Professional 556
Репутация в разделе: 255
0
Quote:
Originally Posted by netwind
все ясно. в багтрекере обычно такое кончается вердиктом "work as designed" (переводиться обычно как "сам дурак").
попробуй запостить ради интереса.
Да я и не собираюсь - нафиг мне это надо
И я понимаю что они так специально сделали (не зря стоит проверка на то что задача запускается из админки - явно как раз для того чтобы запускать повышения для таких неотработанных пользователей), но хоть где-нибудь бы написали что именно так оно должно работать. И сделали бы нормальную документацию как привязать крон булки к системному крону через cli php или вообще убрали бы из кода проверку на системный крон и cli режим...
@netwind
Гуру
Join Date: Aug 2005
Location: Рiдна Олбанея
Posts: 3,844
Версия vB: 3.8.x
Reputation:
Гуру 1227
Репутация в разделе: 901
0
Проверка на запуск из админки нужна чтобы нельзя было просто перейти по урл задачи и запустить ее как скрипт. Никакой нормальной документации на левые трюки не будет. Зачем фирме нужен гемморой по их поддержке?
@Yoskaldyr
Специалист
Join Date: Jan 2007
Posts: 543
Версия vB: 4.0.x
Reputation:
Professional 556
Репутация в разделе: 255
0
Quote:
Originally Posted by netwind
Проверка на запуск из админки нужна чтобы нельзя было просто перейти по урл задачи и запустить ее как скрипт.
а проверка что бы нельзя было запустить напрямую php скрипт вот это
PHP Code:
error_reporting(E_ALL & ~E_NOTICE); if (!is_object($vbulletin->db)) { exit; }
и именно здесь нет никакой привязки к админке.
Дальше обсуждать тему не вижу смысла, т.к. свою проблему я решил и надеюсь если у кого возникнет похожая ситуация это хоть немного поможет. Оффтоп
netwind, мне нравится движок булки, некоторые части написаны очень красиво и с очень элегантными решениями, но есть и просто куски такого ужасного кода, что просто удивляешься - неужели этот код писали сотрудники одной фирмы.
Понятно что булку пишет целая команда разработчиков, но учитывая что самые лучшие кадры сейчас пишут 4-ю версию, логично предположить что недавно набранные сотрудники продолжают поддерживать 3.х.х версии. Что в конечно сказывается на качестве продукта не в лучшую сторону - релиз 3.8.4 тому подтверждение (не столько исправили глюков, а сколько добавили новых)
Yoskaldyr добавил 26.08.2009 в 13:48
Добавил описание проблемы и ее решения в этом посте
Last edited by Yoskaldyr : 08-26-2009 at 02:49 PM.
Reason: Добавлено сообщение
@netwind
Гуру
Join Date: Aug 2005
Location: Рiдна Олбанея
Posts: 3,844
Версия vB: 3.8.x
Reputation:
Гуру 1227
Репутация в разделе: 901
0
Yoskaldyr, так и не понял. в типичном случае, если не изменять время запуска и запускать крон как и было задумано, проблема возникает?
Вообще не понимаю в чем претензия. Весь интервал разделен на равные промежутки времени. Любой пользователь попадет в тот или иной промежуток. Если пользователь на форуме не появляется - нахрен он не нужен крону и его данные обрабатываться не будут.
Что по-твоему не так? Откуда ты придумал погрешность?