Уменьшите количество запросов MySQL с помощью jQuery и PHP - PullRequest
1 голос
/ 27 апреля 2011

Я строю «многопользовательский мир» с помощью jQuery и PHP.Вот как это работает:

  1. Позиции персонажа пользователя взяты из базы данных, соответственно отрисовывается пользователь (значения позиции - значения CSS - слева и сверху)

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

  3. Чтобы сделать это "глобальным" (чтобы пользователи видели друг друга) какМожно сказать, что значения необходимо обновлять сразу для каждого пользователя, используя AJAX

Проблема, с которой я столкнулся, заключается в том, что мне нужно постоянно вызывать написанную мной функцию JavaScript, которая подключается кMySQL сервер и получает значения из таблицы базы данных.И эту функцию нужно постоянно вызывать через setInterval(thisFunction, 1000);, однако мой хост только что приостановил меня за перегрузку ресурсов сервера, и я думаю, что это из-за всех моих запросов MySQL.И даже после многократного получения значений из моей базы данных мне также приходилось вставлять значения каждые несколько секунд, чтобы я мог представить, что со временем произойдет сбой, если для входа в систему будет достаточно клиентов.Как я могу уменьшить количество запросов, которые я использую?Есть ли другой способ сделать то, что мне нужно сделать?Спасибо.

Ответы [ 6 ]

2 голосов
/ 27 апреля 2011

По сути, это то же самое, что и система чата в отношении использования ресурсов. Попробуйте поиск, и вы найдете много разных решений, включая такие понятия, как long polling и memcached . Например, проверьте эту ветку: Масштабирование приложения чата - короткий опрос или длинный опрос (AJAX, PHP)

0 голосов
/ 27 апреля 2011

Оформление заказа Tornado

Со своего сайта:

Tornado - это версия масштабируемого, неблокирующего веб-сервера и инструментов с открытым кодом FriendFeed.Приложение FriendFeed написано с использованием веб-фреймворка, похожего на web.py или веб-приложение Google, но с дополнительными инструментами и оптимизациями для использования преимуществ базовой неблокирующей инфраструктуры.

Фреймворк отличается от большинстваосновные платформы веб-серверов (и, конечно, большинство структур Python), потому что они неблокирующие и достаточно быстрые.Поскольку он неблокирующий и использует epoll, он может обрабатывать тысячи одновременных постоянных соединений, что означает, что он идеально подходит для веб-сервисов в реальном времени.Мы создали веб-сервер специально для работы с функциями FriendFeed в режиме реального времени - каждый активный пользователь FriendFeed поддерживает открытое соединение с серверами FriendFeed.(Для получения дополнительной информации о масштабировании серверов для поддержки тысяч клиентов см. Проблему C10K.)

0 голосов
/ 27 апреля 2011

Есть другой способ, это эмулировать или использовать настоящие сокеты. Вместо того, чтобы постоянно извлекать данные (обновляясь, чтобы проверить, есть ли новые записи), вы можете перенести данные через WebSockets , который работает в Chrome на данный момент (по крайней мере, насколько мне известно, не пробовал в FF4) или вы можете использовать Node.js для более длинного пула. Таким образом, общение между игроками будет двунаправленным без необходимости MySQL для хранения позиций.

0 голосов
/ 27 апреля 2011

Вы можете использовать веб-сокеты для решения этой проблемы.Прочтите это учебное пособие по nettuts .

0 голосов
/ 27 апреля 2011

Вы можете сохранить все позиции в памяти, используя memcached См. http://php.net/manual/fr/book.memcached.php и сохранять их все раз в несколько секунд в базу данных (при необходимости).

0 голосов
/ 27 апреля 2011

Вы должны посмотреть на длинный опрос - http://en.wikipedia.org/wiki/Push_technology. Этот метод позволяет вам установить соединение с вашим сервером, а затем обновлять его только тогда, когда вам нужно. Однако, судя по звукам, у вас происходит довольно интенсивная вещь, если вы хотите обновлять каждый раз, вы можете захотеть найти другой способ хранения этих данных, но если вам интересно, как это делают крупные компании, они, как правило, огромное количество серверов, чтобы справиться с этим для них, но они также будут использовать технику, похожую на длинный опрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...