Доступ к базе данных каждую секунду с помощью ajax

#php #mysql #ajax #performance

#php #mysql #аякс #Производительность

Вопрос:

У меня есть JavaScript скрипт, который использует Ajax для вызова PHP страницы php-страницу для получения новых обновлений из MYSQL базы данных..

Ajax запрос повторяется каждую секунду .

Является ли хорошей практикой обращаться к базе данных каждую секунду? Есть ли какие — либо другие предложения по улучшению этой операции?

Редактировать

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

Комментарии:

1. Является ли это «хорошей практикой», полностью зависит от приложения. Сколько данных вы извлекаете каждую секунду? У вас есть достаточно быстрый сервер базы данных? Вы видите какие-либо изменения в производительности при использовании более длинных или коротких интервалов? Вам нужно будет рассмотреть ваши требования и сравнить результаты в вашей собственной системе, чтобы решить, хорошая ли это идея.

2. Можете ли вы дать больше информации о цели? Почему каждую секунду? Почему кэширование не является опцией при принудительном обновлении? Может быть, есть способ оптимизировать ваш подход.

3. хорошо, спасибо. так что стандартного способа нет :), я должен протестировать и посмотреть

4. может быть, посмотрите на использование nodejs ??

Ответ №1:

Убедитесь, что вы не используете setInterval , а используете обратные вызовы, когда ваш вызов ajax успешен, иначе у вас может быть отставание в вызовах, которые застревают.

Также вы можете захотеть использовать некоторые методы длительного опроса, такие как websockets, comet или отправленные сервером события.

Ответ №2:

Я бы не стал создавать зависимость между моим пользовательским интерфейсом и моей базой данных напрямую.

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

Вызов пользовательского интерфейса веб-службы и взаимодействие веб-службы с базой данных отделяет решения «как часто пользовательский интерфейс должен запрашивать дополнительные данные?» от «как часто я должен проверять свою базу данных на наличие обновлений?»

Ответ №3:

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

В качестве альтернативы, если вам нужна актуальная информация всякий раз, когда пользователь выполняет какое-либо действие, просто опросите базу данных в начале этого действия.

Комментарии:

1. «Никогда» здесь используется в неявном контексте «При наличии текущей доступной технологии». Кроме того, использование любого другого слова, как правило, заставляет людей думать, что их приложение является исключением, вместо переоценки того, что они делают, чтобы попытаться найти более оптимальное решение.

Ответ №4:

Вероятно, лучше использовать SJAX (синхронный), если вам действительно нужно делать запрос каждую секунду. Это поможет сократить отставание вызовов. потому что он делает второй запрос после получения первого ответа. например:

     funftion get_data(){

                   if (window.XMLHttpRequest){// code for IE7 , Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            }
            else{// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("GET", url ,**false**);
            xmlhttp.send(null);
                            return xmlhttp.responseText;
                     }
 

используйте false в методе open(), чтобы синхронизировать его