Ajax «Есть ли новый контент? Если да, обновите страницу» - как это сделать, не ломая сервер? - PullRequest
9 голосов
/ 14 ноября 2008

Это простой случай javascript, который непрерывно спрашивает "уже есть?" Как четырехлетний на машине. Но, как и родители, если вы делаете это слишком часто, или, когда у вас слишком много детей, сервер сжимается под давлением ...

Как вы решаете проблему наличия веб-страницы, которая ищет новый контент в порядке каждые 5 секунд и которая позволяет большему количеству посетителей?

Ответы [ 10 ]

5 голосов
/ 14 ноября 2008

stackoverflow делает это каким-то образом, хотя не знаю как.

Более стандартным способом действительно был бы JavaScript, который ищет новый контент каждые несколько секунд.

Более продвинутый способ - использовать push-like технику, используя Comet (длинный опрос и т. По этой ссылке много интересного.

Я все еще жду хорошей возможности использовать его сам ...

О, и вот ссылка из stackoverflow об этом:
Есть ли какой-нибудь способ для передачи данных с веб-сервера в браузер?

2 голосов
/ 14 ноября 2008

Вы можете начать опрос каждые 5 секунд, но через некоторое время начните увеличивать интервал опроса - возможно, до некоторого верхнего предела (1 минута, 5 минут - все, что кажется оптимальным для вашего использования). Увеличение не обязательно должно быть линейным.

Более сложное вращение (которое может включать предложение Монзи варьироваться в зависимости от количества клиентов) будет состоять в том, чтобы позволить серверу определять интервал перед следующим опросом. Сервер может со временем увеличить интервал, и вы даже можете изменить алгоритм на лету или в ответ на загрузку сети.

2 голосов
/ 14 ноября 2008

Вы можете сделать переменную времени опроса в зависимости от количества клиентов. Используя вашу метафору, ребенок спрашивает: «Мы уже там?» и водитель отвечает: «Нет, но, может быть, через час». К счастью, Javascript не упрямый ребенок, поэтому вы можете быть уверены, что он не будет вас беспокоить до тех пор.

2 голосов
/ 14 ноября 2008

В Java я использовал библиотеку Ajax (DWR) с использованием технологии Comet - я думаю, вы должны искать библиотеку в PHP, используя ее. Идея заключается в том, что сервер отправляет один очень длинный Http-ответ, и когда ему есть что отправить клиенту, он завершает его и отправляет новый ответ с обновленными данными. С его помощью клиенту не нужно пинговать сервер каждые x секунд, чтобы получить новые данные - я думаю, что это может помочь вам.

1 голос
/ 14 ноября 2008

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

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

1 голос
/ 14 ноября 2008

Вы можете взглянуть на 'Twisted' framework в python. Это основанная на событиях структура сетевого программирования, которая может удовлетворить то, что вы ищете. Может использоваться для отправки сообщений с сервера.

0 голосов
/ 15 ноября 2008

Я полагаю, что подход должен основываться на комбинации сокетов на стороне сервера и ajax / comet на стороне клиента. Как:

Предположим, что приложение чата с несколькими вошедшими в систему пользователями, и что каждый из них слушает через медленный AJAX-вызов скрипта на стороне сервера.

Независимо от того, какой браузер получает только что введенные данные, он отправляет их на сервер с помощью ajax-вызова сценария записи. Этот сервер обновляет базу данных (или систему хранения) и отправляет запись сокетов в отмеченный сценарий прослушивателя. Затем последний получает свежие данные и отправляет их обратно в браузер клиента.

Сейчас я еще не написал это, и сейчас я не знаю, насколько ли / как браузер ограничивает число двух одновременных подключений, чтобы испортить вышеуказанную логику.

Буду признателен, если вы услышите кого-нибудь, у кого здесь есть мысли.

AS

0 голосов
/ 14 ноября 2008

Относительно того, как SO это делает, обратите внимание, что он не проверяет новые ответы постоянно, только когда вы вводите в поле «Ваш ответ».

Тогда ключ заключается в том, чтобы сначала выполнить вычислительно дешевую операцию, чтобы отсеять типичные случаи «не требуется обновление» (например, ввести новый ответ или проверить метку времени), прежде чем инициировать более дорогой процесс для фактического получения любых изменений.

С другой стороны, в зависимости от вашего приложения, вы можете решить эту проблему, оптимизировав свой механизм публикации изменений. Например, возможно, было бы целесообразно, чтобы изменения (или их резюме) были помещены в канал RSS, и клиенты могли просматривать канал вместо реального приложения. Мы можем предположить, что это было бы довольно эффективно, так как это именно то, для чего RSS разработан и оптимизирован, плюс у него было бы дополнительное преимущество, состоящее в том, чтобы сделать ваше приложение намного более совместимым с остальным миром при минимальных затратах или бесплатно. вы.

0 голосов
/ 14 ноября 2008

У меня будет один экземпляр, вызывающий БД, и, если существует более новая отметка времени, поместите эту новую отметку времени в переменную приложения. Затем пусть все сеансы сверяются с этой переменной приложения. Или что-то типа того. Таким образом, только один экземпляр вызывает sql-сервер, и количество клиентов не имеет значения.

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

0 голосов
/ 14 ноября 2008

Проверьте эту ссылку , она объясняет различные методы веб-удаленного взаимодействия

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