Как ежесекундно обновлять данные?

Добрый день, подскажите как правильно организовать обновление данныех?

Вот например всякие там фермы вконтакте. Построил растение, и идет отсчет времени, пользователь обновил страницу, ему показывает сколько осталось времени, ушел гулять, вышел из игры, после завершения отсчета, выполняется функция. Как это правильно организовать? Кнон? А если пользователей много, сервер не будет глючить?
  • Вопрос задан
  • 4064 просмотра
Пригласить эксперта
Ответы на вопрос 6
Так там таймер работает на стороне сервера, который запускается по нажатию кнопки "Построить". А пользователю этот таймер и вообще всё отображается через JS насколько я знаю. Когда таймер истекает можно сделать обновление страницы.
Т.е. данные ежесекундно не обновляются.
Ответ написан
Если не нужно никаких вычислений на сервере в отсутствие пользователя, то marrk2 прав, даже cron не нужен. Но если все таки необходимо чтобы сервер был живой и постоянно обрабатывал данные, то смотрите в сторону очередей (queue). Например https://github.com/pda/pheanstalk, https://github.com/videlalvaro/php-amqplib, https://github.com/videlalvaro/Thumper. А также можно посмотреть на pgq для postgresql.
Ответ написан
Комментировать
begemot_sun
@begemot_sun
Программист в душе.
1. На стороне сервера куда то пишется запись "требуемое действие, время совершения этого действия, сопутствующая информация (юзер, комната и т.п)". Существует система которая отслеживает ближайшие события (по полю "время совершения") и отрабатывает нужные действия, изменяя состояние комнаты, юзера и т.п. Если клиент подключен, то посылается соотвествующая команда клиету об изменении игровой обстановки.

2. На стороне клиента:
а) клиент опрашивает сервер обо всех событиях, которые должно произойти у пользователя.
б) по таймеру клиенты выводит эти события в нужных местах и обновляет им время.
Ответ написан
Как все усложняют... Просто пишете timestamp момент, когда событие началось. Далее, зная сколько событие должно идти и время его начала, при загрузке страницы всегда можно узнать сколько осталось времени
// now - текущий timesamp
// timesamp - сохраненный timesamp начала отсчета
// duration - длительность события в секундах
if (now > timestamp + duration) {
   // событие уже истекло
} else {
   // осталось (timestamp - now) секунд
}


И не нужно никаких кронов. Только нужно учесть, что разница клиентского и серверного таймера будет равняться времени загрузки страницы.
Ответ написан
Комментировать
@m0rd
Aliance прав. Сам писал такое решение. Связка php+js, информация о событиях хранится в базе. При начале события ставится js таймер, который по завершению обновит страницу. При загрузке страницы смотрим в базе текущие события, если что-то завершилось - выводим информацию, если нет - выводим таймеры js на события..
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы