PHP: выполнить действие через определенное время - PullRequest
1 голос
/ 26 октября 2011

Доброе утро / день / вечер, интернет.В настоящее время я занимаюсь разработкой wap-игры и столкнулся с проблемой: применять долгосрочные эффекты к другим игрокам.Позвольте мне объяснить.

Если пользователь использует «мгновенную» способность, это просто обычная командная ссылка, которая делает executeAbility();Если пользователь разыгрывает заклинание, сценарий выполняет следующее:

setPlayerState('casting');
sleep($cast_time);
executeAbility();

Хотя это всего лишь простая часть.Теперь, если мы перейдем к более продвинутым методам, таким как проклятие игрока, я заблудился.Я уже рассмотрел следующую возможность:

$time=$_SERVER['REQUEST_TIME'];
$time_when_the_curse_finishes=$time+$curseDuration;
updateEnemyCurses($curseID,$endTime);
if ($time<$endTime) removeCurse();

Это может выглядеть красиво и все, но это не учитывает две вещи: если пользователь вышел из системы и снова вошел через 2 часа, онпотратил бы целых два часа проклятых и , этот метод не может поддерживать эффект каждые x секунд в течение y секунд вид проклятий.Например:

Проклятие первое.Вы получаете 1 урон каждые 2 секунды в течение 10 секунд.

Подводя итог, мне просто нужен совет или два, как я могу сделать возможную линию выше.Само проклятие должно было бы проверять свое время глобально (не с перезагрузками страницы) и иметь возможность выполнять запросы (в этом случае тики повреждения) каждые x секунд, пока оно не будет удалено за 10 секунд.заранее за любые советы, предлагаемые здесь!

Ответы [ 4 ]

5 голосов
/ 26 октября 2011

Возможно, вы захотите настроить скрипт cron для этого типа «обслуживания».

Может запускаться с фиксированным интервалом (т. Е. Каждую секунду) и обрабатывать проклятия и т.д. для всех игроков

Начни здесь :) http://en.wikipedia.org/wiki/Cron

Редактировать : Как уже упоминали другие (@ mark-b), лучше уточнить: используйте cronjob для одного скрипта, который управляет всей работой, а не несколько cronjobs для каждой части работы .

2 голосов
/ 26 октября 2011

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

Тогда одно задание cron может извлекать задания из этой очереди и обрабатывать их. Таким образом, для вашего события «проклятие» вы должны установить флаг проклятия для пользователя и запланировать выполнение задания на now + 5 minutes со словами «убрать проклятие X с пользователя Y».

Задание cron будет запускаться периодически (с любой частотой, возможно, в вашей игре 'tick') и запрашивать список заданий, которые необходимо выполнить в этот конкретный период времени.

2 голосов
/ 26 октября 2011

Я полностью понимаю вашу проблему, потому что здесь, на работе, мне приходилось иметь дело с функцией, которая требовала решения, которое могло бы вам помочь. Что я сделал, так это установил таблицу БД, в которой хранятся все требуемые / ожидающие действия и владелец действия. В этой таблице была временная метка, и за определенный интервал я проверил, какие действия необходимо выполнить для этого пользователя. Другие пользователи также проверили эту таблицу и удалили прошлые действия, которые не были извлечены (то есть владелец этого действия вышел из системы). Проблема здесь заключалась в том, что делать, если ни один пользователь не вошел в систему вообще, и я сделал следующее: когда пользователь входит в систему, он сначала проверяет таблицу ожидающих действий и, при необходимости, очищает ее. Я надеюсь, что смогу дать вам некоторое представление. Удачи!

0 голосов
/ 26 октября 2011

Знаете ли вы шестерёнку? Я думаю, вы должны создавать асинхронные задания.

посмотреть на: http://php.net/manual/en/book.gearman.php

...