Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > каждую секунду выполнять 1 запрос


Автор: supervladislav 17.7.2011, 14:38
скажите как можно решить следующую задачу :
нужно каждую секунду выполнять запрос   в течении x секунд где x число до 15 

скажите как лучше сделать чтобы расходовать меньше выч мощности через триггер 
хранить информацию о времени и находить раздницу во времени между метками выполнять подобие вложенного запроса или 
через php 

Автор: vencendor 18.7.2011, 08:20
x - это количество секунд затраченных на выполнение одного запроса ? 
Обычно требуется чтобы не было несколько запусков одного процесса в то же время. Существует вероятность что два процесса будут работать с теми же данными и в итоге получиться неадекватный результат. 
Если так то нужно ставить метку начала процесса (обычно просто создание файла) и удаление метки в конце. Если метка есть то не запускать вторую копию. 
Можно создать оболочку которая будет собирать время выполнения последних запусков и оновываясь на этих данных запускать или нет следующий процесс. 

Автор: supervladislav 18.7.2011, 11:35
мне нужно чтобы каждую секунду выполнялся запрос sql 
в течении  x секунд на php,это нужно для серверного сценария компьютерной игры 
чтобы у игрока в течении 8 секунд убывала мана 
В триггер аргумент блин не передать никак 

Автор: programming 18.7.2011, 15:26
Так?
Код

<?php
$i=0;
$x=15;
while($i<$x)
{
//sql query
$i++;
sleep(1);
}
?>

Автор: supervladislav 18.7.2011, 16:00
что-то вроде такого <Но мне надо чтобы это было независио от остального кода тоесть наверное стоит обратиться к триггерописанию 

Автор: NFL 18.7.2011, 16:02
supervladislav, на стороне клиента пробовали это сделать?

Автор: CruorVult 18.7.2011, 16:03
Цитата(supervladislav @  18.7.2011,  16:00 Найти цитируемый пост)
Но мне надо чтобы это было независио от остального кода


А что значит независимо?

Добавлено через 54 секунды
Цитата(NFL @  18.7.2011,  16:02 Найти цитируемый пост)
на стороне клиента пробовали это сделать

а если юзер обновит страницу или браузер подвиснет.

Автор: supervladislav 18.7.2011, 16:05
Или есть какойнибудь иной способ

Добавлено через 52 секунды
ну тоесть чтобы это сработало скажем при обновлении базы данных тоесть через триггер ,но как блин внутрь триггера дать аргумент 

Автор: CruorVult 18.7.2011, 16:08
Сделать можно с помощью fsockopen.
Кидаете запрос на файл 

mana.php
Код

<?php
$i=0;
$x=15;
while($i<$x)
{
//sql query
$i++;
sleep(1);
}
?>


а юзеру жс-ку, которая переодически юзает сервер и смотрит сколько сейчас маны!

Автор: supervladislav 18.7.2011, 16:11
удобнее было бы сделать через триггер
Вобще светлая идея а с выч мощностью как быть 


Автор: NFL 18.7.2011, 21:19
Цитата(CruorVult @  18.7.2011,  16:03 Найти цитируемый пост)
а если юзер обновит страницу


Ммм... Ну запускаем скрипт заново, $(document).ready(function(){...})

Автор: CruorVult 19.7.2011, 09:43
Цитата(NFL @  18.7.2011,  21:19 Найти цитируемый пост)
Ммм... Ну запускаем скрипт заново, $(document).ready(function(){...})


Ну если о клиенской игре речь - то возможно!

Но скорее всего мы говорим об онлайн игре, где любые реакции пользователя должны обрабатываться сервером.

Автор: NFL 19.7.2011, 10:16
CruorVult, если вы не поняли - то я намекаю на ajax ;) 
Потому и упомянул про "игру с клиентом"  smile 

Автор: CruorVult 19.7.2011, 10:27
Цитата(NFL @  19.7.2011,  10:16 Найти цитируемый пост)
CruorVult, если вы не поняли - то я намекаю на ajax ;) Потому и упомянул про "игру с клиентом"   


Ну допустим идет бой. Один боец коцнул другого магией, соответственно у второго начинается уменьшаться здоровье а у первого мана. И тут первый подвис и второй уже не дождется окончания боя.

Автор: supervladislav 19.7.2011, 12:10
CruorVult, на это и есть он лайн игра 

Автор: voral 19.7.2011, 14:49
Очуметь. Если вы планируете игру на десяток игроков еще ни чего. Но если вы планируете реальную игру и рассчитываете на игроков.... То вам нужен очень  навороченный сервер. Если вы его хотите ежесекундно запросами долбать. 
Если вам нужна двухстороння связь. (Т.е. событие у одного игрока отображалось на остальных) то забывайте про php. Так как вам нужно, чтоб клиент устанавливал постоянное соединение с сервером. В этом случае у вас вся игра будет крутится на сервере, а клиенты будут, по сути, лишь интерфейсом. Пишите сервер на сях, да клиента на флеше. Можно, конечно, без постоянных соединений клиента на js забабахать..... Но это все равно будет жесть. Т.к. каждый игрок будет http-запросы ежесекундно слать на сервер.

Добавлено через 2 минуты и 49 секунд
Сами подумайте. Играют два человека. Каждую секунду, каждый игрок отправляет http-запрос. На сервере запускается скрипт, который коннектится к базе, отправляет запрос, формеирует страницу и отправляет по http обратно..... А если за минуту никто ни чего не сделал, то сразу столько мусорного трафика.

Автор: NFL 19.7.2011, 14:58
voral, ну почему сразу заывать о php? можно посмотреть в сторону Comet smile 
А долбать сервер таки да ) Негуманно )

Автор: voral 19.7.2011, 15:19
Цитата(NFL @  19.7.2011,  14:58 Найти цитируемый пост)
voral, ну почему сразу заывать о php? можно посмотреть в сторону Comet smile 

Отстал от жизни smile
Но! smile
С точки зрения игры. 
Нас колько я понял это технологию Comet. Нам придется для каждого игрока иметь запущенную копию скрипта обрабатывающую это псевдо-постоянное соединение. Т.е. каждый з этих скриптов будут жить сами по себе. Встает вопрос, кто будет обслуживать игровые ситуации? Если тащить в эти же скрипты - жесть мне кажется, да и вслучае сбоя в одном скрипте мы попадаем в непонятную ситуацию. Можно выделить обработку в отдельный скрипт вечно крутящийся на сервере. Но  php вроде пока не позволяет многопоточное что то написать, т.е. один экземпляр на каждую игру. Т.к. адресное пространство у скриптов разное - обмениваться только через БД. Тут мы опять упираемся в долбление БД с поводом и без.
Хотя, конечно, вроде используют для чатов и даже финансовых ресурсов (жесть ИМХО)....

Не знаю не знаю. Чисто мое мнение с учетом задачи "написание онлайн игры": проет либо на малое число пользователей, либо достаточно быстро станет не нужен, либо встанет вопрос о переписывании с 0.
Это чисто, ИМХО, на абсоютную правоту не претендую, но ТС необходимо неколько раз взвесить и сопоставить свои цели и выбираемые инструменты решения

Автор: CruorVult 19.7.2011, 15:55
Согласен с voral, написание онлайн игры, которая постоянно поддерживает контак с сервером на пхп это тоже самое что мухе пытаться поднять слона.
Сейчас кстати развивается server-side JavaScript, который и расчитан на выполнние такого рода задач.
Вот к примеру можно глянуть как работает браузерная игра, серверная часть которой написана на JS

http://www.youtube.com/watch?v=Ol3qQ4CEUTo&feature=related

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)