За последние 24 часа нас посетил 19001 программист и 1637 роботов. Сейчас ищут 1762 программиста ...

DeferredEvent - выполнение событий в определенное время

Тема в разделе "Решения, алгоритмы", создана пользователем TheShock, 16 июл 2009.

  1. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Данная библиотека рассчитана на то, чтобы облегчить выполнение определенного действия в указанное время.

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

    Архив на гуглокоде: http://code.google.com/p/deffered-event/downloads/list

    == Краткая инструкция ==

    В архиве в директории DeferredEvent - сама либа. Остальное - это демонстрационный код.
    В файле dump.sql - запросы для создания двух таблиц - `DefferedEvents` и `messages`. Первая нужна для либы, вторая - используется в качестве примера.
    В файле init.php на 13 и 14 строках стоит поменять параметры подключения к базе данных.

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

    В data/ хранятся три файла, в которые будет производиться запись. Поставьте им соответствующие права доступа.

    Подробнее - в исходниках. Если что непонятно - спрашивайте, отвечу.

    Лицензия - LGPL

    PS. Интересует мнение опытных товарищей. Что скажете о качестве кода, о подходе и о читаемости? Что бы вы сделали не так. В общем, интересует здоровая критика
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    опытные бойскауты полагаются на crontab, но полет мысли интересен.
     
  3. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ну крон - штука, вроде, не кроссплатформенная, плюс я не нашел в интернете, как настраивать его во время выполнения скрипта. например через юзер-френдли админку. Подозреваю, что это можно сделать с помощью функции exec, но при может быть включен safe-mode. Более того, нашел в интернете, что крон - тоже не без багов. Ну и DeferredEvent то можно настроить под себя ровно настолько, насколько это надо :)
     
  4. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    крон есть как под винду, так и под юних, как минимум :)
     
  5. kostyl

    kostyl Guest

    Посмотри как это делает cpanel
     
  6. я еще полагаюсь на MySQL events =)
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    в cpanel/ISP висит демон под рутом. он че хошь запустит.
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Я вот что подумал. Ведь отложенные события могут использоваться для таких вещей, для которых крон не подходит.

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

    Да и вообще - онлайн игру можно сделать полностью на таком подходе, а не на подходе - ждать, пока дернут, а только потом измениться (в ОГейме перед тем, как изменять процент загрузки шахт надо было обновить страницу, иначе все время, пока она не обновлялась считалось, что шахты работали по только что измененному проценту. Кто играл - тот знает). Все - создание юнита, прилет флота, начало боя - регистрируется отложенными событиями и, как только хоть кто-то обновляет страницу, все события собираются в кучу и выполняются.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Так не интересно :)
    Это не альтернатива crontab. Фишка cron'а как раз в том, чтобы действия выполнялись даже если систему никто не трогает.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ресуср не надо хранить, его надо расчитывать по формуле. Нужно фиксировать время и количество ресусра при последнем влияющем на него действии игрока. Например, потерял игрок 10hp - фиксируем, что у него осталось 90hp и таймстам этого события. Потом просто расчитывай востановление hp по прошедшему времени. И хоть каждую секунуд обновляй страницу - всегда будешь видеть актуальное значение =) При чем расчет можно делать вообще javasscript'ом, чтобы эта полоска росла у пользователя в реальном времени без всяких запросов.
     
  11. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    некропостинг детектед
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Че за глюк phpbb? Почему эта тема была как непрочитаная и первой в списке? o_0
     
  13. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    ты спамеру отвечал
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    у меня тоже такое было когда-то, но я успел удалить свое сообщение пока кто-то отвечал на мой некропост =).