Походу имеется в виду безрефрешевый чат. Я знаю два способа: 1. Бесконечный цикл с flush()'ем. Плохая штука, делает очень большую нагрузку на сервер. 2. Незаметная подгрузка скрипта/iфрейма, что-то вроде этого.
Нафик фреймы и тем более flush() гараздо проще сделать всё на JavaScript (читаем журнал рнрклуба про Ajax с помошью createElement и радуемся)
Я лично юзаю скрипт который проверяет БД на наличие доп. сообщений и если они есть то происходит обновление фрейма при помощи JS. Ток вот сомневаюсь в полной безопасности данного способа
Хм... а при большой нагрузке, хотя бы в 100 пользователей? Не слишком ли жирно получится? Не вижу логики..
пока не зделали такой проект наш разговор пустая болтовня. выдержит - не выдержит... давайте допустим что у нас нет в чате аякса который добавит к существующему окну сообщений новые. у нас обычное обновление (болье громоздкий вариант с посточнным конектом откыдываем сразу так как дял пхп это не гламурно, пхп не перл). так вот вернемся к нашим баранам. имея простое обновление (рефреш страницы) каждые 15 секунд мы имеем такую же нагрузку запрашивая эти же данные аяксом, с той лиш разницей. что а) мы генерируем больше трафика. (минус в сторону рефреша плюс аяксу) б) мы создаем больше нагрузки на сервер процем той же генераци. выбор всего и выбор лишь какойто записи, собственно генерация по шаблону. В случае если данные не в mysql мы упускаем вариацию с выборкой. собственно насчет слов - "достаточно ресурсозатратно", ну это смотря а) как напишут б) на чем напишут в) как поставят, где и на чем поставят г) как настроят грамотно продумать это единственное что имеет значение в данном случає. =)
с этого и нужно начинать какова бы ни была технология использована, при кривой архитектуре самого приложения - сами понимаете, ничего хорошего не выйдет
Вот как выглядит у меня фрейм который рефрешит нужные фреймы <? session_name("chat"); session_start(); mysql_connect("localhost", "user", "password") or die("Could not connect"); mysql_select_db("chat") or die("Could not select database"); ?> <html> <head> <META HTTP-EQUIV="Refresh" CONTENT="5; URL=./refresh.php"> <script language="JavaScript"> function mess(){ parent.messages.location.href= "./print.php"; } function list(){ parent.messages.location.href= "./print.php"; parent.users.location.href= "./list.php"; } </script> </head> <? $user = $chat_user; $q = "SELECT * FROM message"; $res = mysql_query($q) or die("ERROR!!!"); //выбираем все сообщения $n = mysql_num_rows($res); //и считаем их кол-во $q = "SELECT * FROM users WHERE (status='1')"; //выбираем юзверей $res = mysql_query($q) or die("ERROR!!!"); //в онлайн $online = mysql_num_rows($res); //и считаем их кол-во $q = "SELECT * FROM chat_refresh WHERE (mess<'$n' && user='$user') and (list>'$online' or list<$online) "; //проверяем есть ли $res = mysql_query($q) or die("ERROR!!!"); //изменения в кол-ве if(mysql_fetch_array($res)){ //пользователей, если есть то echo " //обновляем список <body onLoad=\"list()\"> //пользователей и сообщений ";// т.к. пришло оповещение о приходе/покидании $q = "UPDATE chat_refresh SET list='$online' WHERE(user='$user')"; //чата юзверем потом обновляем записи в БД mysql_query($q) or die("ERROR!!!"); $q = "UPDATE chat_refresh SET mess='$n' WHERE(user='$user')"; mysql_query($q) or die("ERROR!!!"); } else { $q = "SELECT * FROM chat_refresh WHERE (mess<$n) and (user='$user')"; //проверяем наличие новых сообщений $res = mysql_query($q) or die("ERROR!!!"); if(mysql_fetch_array($res)){ echo " <body onLoad=\"mess()\"> // если есть обновляем "; $q = "UPDATE chat_refresh SET mess='$n' WHERE(user='$user')"; mysql_query($q) or die("ERROR!!!"); //не забываем про БД } } ?> </body> </html> P.s. Сильно не пинать... начинающий всё-таки
часть кода можно упроситить до безобразия к примеру $q = "SELECT * FROM message"; и его парсинг меняем на $q = "SELECT count(*) as total FROM message"; потму как имея к примеру 200000 записей создаем ну не просто не нужную нагрузку а супер никомунежную нагрузку. авторайз юзера кидай всесию, и отуда уже используй его ид. за апдейт руки отрезать надо. не safe sql injection решение это точно... -------- это я не сильно пинал ;-)
В sql я плохо разбираюсь (никак нормальную русскую доку не найду в оффлайн варианте...) P.S. А геде почитать про инъекции, т.е. про то какие запросы лучше не юзать?
1) а)mysql.ru - насколько нормальна не знаю, предпочитаю english б) перевд на русский оф документации 2) а) http://kukutz.livejournal.com/238551.html б) http://phpclub.ru/detail/download/jul-a ... 5_2004.pdf