Я делаю окно чата, все работает нормально, за исключением вещи обновления. В настоящее время я обновляю страницу каждые 3 секунды, чтобы проверять любые новые сообщения, но это наверняка вызовет массовую нагрузку на сервер и не будет элегантным.
Я хочу, чтобы окно чата проверяет наличие новых сообщений только тогда, когда база данных обновляется, а не таймер проверки базы данных через каждые 3 секунды
Вы хотите, чтобы AJAX push (сервер отправляет обновление клиенту только тогда, когда есть что-то новое). См. Пример здесь: http://provatosys.com/bid.html
Что-то вроде этого будет вызывать запрос от клиента:
function sendRequest(uid){ var xmlhttp; var myUserId=""; myUserId=uid; if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ displayInChat(xmlhttp.responseText)//do stuff (process response, display message) } } xmlhttp.open("GET","process_request.php?userid="+uid,true); xmlhttp.send(); setTimeout("sendRequest("+uid+")",1000); //poll every second }
Теперь вы хотите отложить ответ с вашего сервера (process_request.php) до тех пор, пока не будет чего-то, что можно отправить (используя что-то вроде while (($msg=new_msgs()) === false) {sleep(timeout);}
например) или время запроса и новый опрос отправляется от клиента ( setTimeout("sendRequest("+uid+")",timeoutinmillisecs);
). Это называется длинным опросом, и для приложений, таких как чаты, более эффективно, чем отвечать пустым ответом.
Вы можете найти более подробную информацию здесь: Как реализовать базовый «длинный опрос»?
и здесь: Сделать вызов AJAX ждать события в php
и здесь: комета (программирование)
[EDIT] В качестве очень необходимой и более эффективной альтернативы длительному опросу теперь все основные браузеры поддерживают веб-узлы . RFC6455 вошел в статус (предлагаемого) стандарта в 2011 году (что означает, что он покинул проект статуса и не имел никаких изменений с тех пор). Лучшей реализацией в PHP, вероятно, является Ratchet (насколько я знаю, что на сегодняшний день наиболее соответствует стандарту). Вот учебник о том, как создать веб-чат, используя его: http://socketo.me/docs/hello-world