Как запустить скрипт в определенное время, по меняющемуся списку заданий?

Kruchinin

Новичок
Как запустить скрипт в определенное время, по меняющемуся списку заданий?

Есть интересная задачка.
Работаю сейчас над mmorpg, в которой надо реализовать «отложенные бои». Бой происходит по следующей схеме: 1. отправка войск на врага 2. войска идут какое-то время до крепости врага 3. собственно, сам бой (вычисляем по формуле победителя и потери войск).
1 и 2 пункт тут всё просто, известно время отправки войск, скорость перемещения, вычисляем время прихода войск и соответственно это и будет временем, когда состоится бой. Битва (срабатывание скрипта расчета боя) должна происходить с точностью до секунды, т.к. враг за 2-3 секунды может вывести войска, получить подкрепление и т.д.

Каким образом лучше реализовать данную схему на PHP + MySQL, с учетом того, что на сервере будет довольно большая нагрузка, и 1000-2000 человек онлайн?
 

Dovg

Продвинутый новичок
Например
По крону раз в секунду получать список заданий (битв), и обрабатывать исходя из фактических значений армий.

ЗЫ. что-то подобное сделано в ogame (играл в нее пару лет назад, когда время было ;)
 

MuXaJIbI41981

Новичок
может в сторону сокетов посмотреть ... хотя не уверен

-~{}~ 04.05.08 11:26:

Dovg а не накладно будет каждую секунду скрипт вызывать?
 

AmdY

Пью пиво
Команда форума
нужно чтобы постоянно висел демон, который каждую секунду делает расчёты, причём желательно не на РНР, а на компилируем языке.
 

Андрейка

Senior pomidor developer
Kruchinin
.к. враг за 2-3 секунды может вывести войска, получить подкрепление и т.д.
а это реалтайм или тоже "отложенное"? т.е. помошник тоже отправляет свои войска за пол часа и известно когда они дойдут?
 

baev

‹°°¬•
Команда форума
По крону раз в секунду получать список заданий
— «ох уж эти сказочники...»
Где Вы такой cron видели, чтобы в настройках время меньше минуты можно было указывать?
 

Бочонок

http://frontender.info
По идее это можно реализовать нормально только с помощью "демона". И, например, хранящегося в общей памяти списка задач. Каждую секунду к мускул дергать... Не слишком то это гуманно. И, как мне кажется, ни чем не оправдано. Можно для этой же цели мемкач использовать.

Хотя это теория. Я не сталкивался на практике с такой задачей.
 

Dovg

Продвинутый новичок
baev
Я не прав, признаю себя сказочником
 

Kruchinin

Новичок
Автор оригинала: Андрейка
Kruchinin
.к. враг за 2-3 секунды может вывести войска, получить подкрепление и т.д.
а это реалтайм или тоже "отложенное"? т.е. помошник тоже отправляет свои войска за пол часа и известно когда они дойдут?
Вывести войска враг может в любой момент. Например увидел что на него идет сильная армия, решил не ввязываться в битву и вывел войска из крепости на другую локацию, например, за 10 секунд до нападения.

Подкрепление - "отложенное". Отправляются из других локаций, время прихода подкрепления можно заранее рассчитать.
 

Андрейка

Senior pomidor developer
Kruchinin
расчет одного боя много (процессорного) времени занимает? т.е. в том самом реалтайме сотни(любую достаточную для тебя цифру) боев в секунду можно просчитывать?

-~{}~ 04.05.08 22:04:

в общем
a: battle_id, time - время начала боя (если войска отзываются, то соответстно бой удаляется)
b: battle_id, user_id - таблица со всеми заинтересованными персонажами, т.е. нападающий, защищающийся и все, кто отправил войска на помощь и прилетят до начала боя

cron раз в минуту по таблице a ищет расчитывает все прошедшие бои

если кому-то из заинтересованных лиц захочется обновить статистику или совершить какое либо действие, для которого нужен результат боя, который крон еще не обсчитал, то ищем этот бой в таблице b+a и расчитываем "самостоятельно", не забывая о блокировках, чтобы все вместе, да еще и с кроном на расчитали лишнего одновременно
 

Kruchinin

Новичок
Сам расчет простой, к примеру: суммарная атака = a*20+b*35+...+h*33. Дальше смотрим у кого больше, выявляем победителя, и в зависимости от разницы в атаке считаем потери войск и пишем новые значения a...h.

Если всё в памяти, то занимать будет считанные мс.

Вопрос ещё вот в чем, если при каждом расчете доставать значения a...h из MySQL, не загнется-ли сервер от такого действа?
 

AmdY

Пью пиво
Команда форума
а зачем доставать, нужно использовать процедуры
 

Akick

Новичок
Re: Как запустить скрипт в определенное время, по меняющемуся списку заданий?

Если делать без демонов, то я могу предложить вариант проверки по первому событию + крон для отработки остальных битв (для тех кто в оффлайне). Пример, игрок совершает действие (или атакующий или защищающийся), сначала перед действием (например отсылкой войск) идёт проверка на бой, если уже наступило время боя - производим расчёт и т.д., и выдаём ему результат + его действие, если оно ещё возможно. Пришло подкрепление - аналогично, если бой раньше - значит посчитали бой, и к остаткам приплюсовали подкрепление. Ну и обработка по крону всех, у кого никаких событий не наступило.
В таком варианте, как мне кажется, необходимая точность будет соблюдена. А для тех кто в офф-лайне точность 1 минута (ну или сколько там периодичность по крону будет стоять), не смертельна.

PS. Прошу больно не бить, пост Андрейка, не увидил сразу ;о)
 
Сверху