Помощник
|
Комета |
Alcorn
|
Сообщение
#1
|
||
|
|
||
|
|||
Letmetouchyou |
21.2.2010, 11:14;
Ответить: Letmetouchyou
Сообщение
#2
|
|
вот только я не понял. Ета технология long polling (длинных запросов) ни чем не отличаеться от обыных асинхроонных запросов? только "не моментальным" ответом от сервреа?
значит вся соль тут заключаеться в серверной части, там нужно , например , перебирать базу данных , и когда появитсься что то нужное - выдать клиенту? |
|
|
Alcorn
|
Сообщение
#3
|
|
Ага. Смысл в постоянной поддержке открытого соединения и как на сервере появляется что-то новое - выдаём клиенту.
|
|
|
Letmetouchyou |
21.2.2010, 13:28;
Ответить: Letmetouchyou
Сообщение
#4
|
|
примеров никаких не нашол )
решил попробовать сам. вот что получилось: смысл такой. в начале на странице берем полсений айди в таблице в БД. ЕГо значение записываем в переменную яваскрипта. есть кнопка - ассинхронный запрос на добавлени новой записи в таблицу. При завершении запроса - в переменную , которая хранит значние полседней записи в таблице, записываем новое значение. ето происходит на стороне клиента. (тут ваиантов миллион как ето делать, напрмиер сесси, куки, а еше лутше ето все проверять в обработчиках и нечиго не передавать). при загрузке дом, вызываем функцию "long polling''. то есть - делаетсья ассинхронный запрос к пхп оброабочику, передаеться полсдний айди в таблице. В самом обработчике циклом проверяем теот переданный айди, с полсденим в таблице. (do while) то есть цикл будет работать пока в базу не добавиться запись. И только когда запись добавиться - етот запрос завершиться, и сработает callback зароса, в котором "говорим" что добавлени запись, и опять делаем вызов "long polling" функции, и получим ответ только поле нового добавления в Бд. index.php <?php require_once 'connect_config.php'; //соединение с бд #####получние послжениего id в таблице $request = mysql_query("select id from poll order by id desc limit 1"); if ($request){ if (mysql_num_rows($request) > 0 ) { $request = mysql_fetch_array($request); $last_id=$request['id']; } } ##### ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <script type="text/javascript" src="jquery-1.3.2.min.js"></script> <script type="text/javascript"> var last_id = <?php echo $last_id;?>; //lasyt_id - глобальная перемнная, хранит полсджений айди в базе. function complete(obj) { alert(obj.name); start(); //вызов loong request }; function getlastid(obj){ //callback функция, послде добавления записи в БД. if(obj.error==false){ last_id=obj.last; //новое значение последнего айди в базе } else alert('ERROR'); } function start() { $.getJSON('ok.php', {last_id : last_id}, complete); // функция long request, в обработчик передается перменная с послденим айди. }; $(document).ready(function(){ start(); //вызов loong request $('#add').click(function(){ $.getJSON('add.php', getlastid); //ассинхронный запрос надобаваление в записи в БД. }); }); </script> </head> <body> <span class="last_name"></span> <button id="add">add_data</button> </body> </html> add.php - добавние в бд [PHP] <?php //обработчки добавлния в бд $error=false; require_once 'connect_config.php'; $request = mysql_query("INSERT INTO poll (name) VALUES ('".rand(10,1000)."')"); //в поле нейм добавляем рандомное число ($request==true)?$last_id=mysql_insert_id():$error=true; header('Content-Type: text/javascript; charset=windows-1251'); ?> { last: '<?php echo $last_id;?>', error: '<?php echo $error;?>' } [/PHP] ok.php - Обработчик long polling [PHP]<?php //обработчик проверки записей $last_id_page = $_REQUEST['last_id']; //получаем последний адйи $last_id=1; require_once 'connect_config.php'; //цикл: берем послжений айди в БД, и сравнием с переданным, тоесть работает пока не появитсья в бд новая запсиь do { $request = mysql_query("select id from poll order by id desc limit 1"); if ($request){ if (mysql_num_rows($request) > 0 ) { $request = mysql_fetch_array($request); $last_id=$request['id']; } } usleep(1000000); } while ($last_id == $last_id_page); ////////////////////////////// //берем поле нейм по новой добавлений записи $request = mysql_query("select name from poll where id='".$last_id."' limit 1"); if ($request){ if (mysql_num_rows($request) > 0 ) { $request = mysql_fetch_array($request); $last_name=$request['name']; } } header('Content-Type: text/javascript; charset=windows-1251'); ?> { name: '<?php echo $last_name;?>' }[/PHP] вот сам пример ето все можно реализовать на много проше, но для меня было главное чтобы просто заработало, а не оптимизация скрипта. ето самый просто пример, от которого можно оттлакиваться ) п.с. если старница долго открта - скрипты могут "ломаться" - но мне пока не интересно почему так :) |
|
|
Alcorn
|
Сообщение
#5
|
|
|
Примеров тоже не находил.
ето самый просто пример, от которого можно оттлакиваться Пример работает, посмотрел. Думаю может прикрутить куда-нибудь данную штуковину, но не знаю о проблемах, с которыми придётся встретиться. В описании на англ. встречал про необходимость каких-то 256 байт перед сообщением, толи в IE, толи в Safari. Плюс есть XHR long polling и XHR streaming. Первый вроде с закрытием соединения, второй - без. Comet Iframe и кроссдоменный js пока не нужен. Вобщем наверное разбираться с возможными ошибками и кроссбраузерностью нужно на живых примерах.
|
|
|
||
|
Текстовая версия | Сейчас: 29.3.2024, 18:11 |