прямой коннект
А как насчет запуска Ajax по таймеру с периодичностью в 0.5 секунды. Такое понравиться?
con.open('127.0.0.1:79',"GET",true);
alert(con.readystate); \\ 1
con.send(' '); \\ тут возникает ошибка, а когда я переношу этот код на сервер, то всё нормально работает, AJAX же вроде с другого хоста не работает...
alert(con.readystate) ;
А насчет постоянного соединения с помощью Ajax: сделать можно, но не всякому хостеру понравятся часами висящие соединения. Хостер может принудительно закрывать такие соединения после какого-то времени после открытия.
Ты что-то путаешь. В браузере объект XMLHttpRequest будет убит самим браузером по таймауту, а серверный скрипт по таймауту также, но уже веб сервером.
Ну может на счёт AJAX я с тобой и соглашусь, но на счет серверного скрипа... Ты хочешь сказать, что сервер закроет мне сокеты, через определённое время или, что ты имел ввиду? Если про сокеты, как сервер сожет мне их закрыть?
по таймауту
не на всех хостингах разрешен set_time_limit(0);
Нет, дело именно в таймауте браузера. Знаю как минимум один работающий проек в котором серверная часть соединение не закрывает вовсе, а просто "досылает" данные. Очень похоже на открытие здоровой фотки через модем :D .
Так вот им там пришлось XMLHttpRequest постоянно пересоздавать, т.к. браузер по таймауту прибивал его. А сервер как не закрывал соединение, так и держал его все время пока подключеные клиенты в таймаут не вылетали.
Хочу напомнить, что HTTP/1.1 как раз не разрывавет соединение после ответа, а может держать его.
Хотя в целом согласен - не чего исспользовать для решения задачи то, что для этого не предназначенно. )
А как это реализуют то? Я вот знаю, что да, делают, а как самому любопытно. Точнее даже так, в упомянутом мною проекте на сервере использовали Java приложение. А вот можно ли реализовать не разрыв соединения в том же Apache? Т.е. что бы из PHP скрипта досылать данные в браузер по постоянному соединению и постоянному 80-ому порту. Как я не прикидывал, так и не догадался, можно ли на PHP так сделать.
Первый вариант: http://ajaxpatterns.org/HTTP_Streaming
Второй вариант. Если немножко подумать зачем может быть нужно такое соединение, то только для оперативного обмена данными между сервером и клиентом. Если кто-нибудь может мне сказать другие причины - буду рад услышать. Так вот, такой обмен данными можно создать и с помощью регулярных соединений с сервером (например раз в 5 секунд) на том же многострадальном Ajax-е. Если на сервере использовать какое нибудь хранилище данных для сообщений то все это можно сделать достаточно просто. Этот вариант я уже предлагал, но топикстартеру он почему-то не подошел.
Хотя я полностью согласен с людьми которые говорят, что по сути сама задача - издевательство над основами веба.
Почитаем. Не факт, что с ходу врублюсь.
Второй вариант. Если немножко подумать зачем может быть нужно такое соединение, то только для оперативного обмена данными между сервером и клиентом. Если кто-нибудь может мне сказать другие причины - буду рад услышать.
Если более конкретно, то чат. Посмотри на тот же chat.chat.ru
Так вот, такой обмен данными можно создать и с помощью регулярных соединений с сервером (например раз в 5 секунд) на том же многострадальном Ajax-е.
В том и дело, что как это все сделать используя Ajax насвязке PHP+JS я отлично знаю. Я не могу заставить серверный скрипт "досылать" данные. Т.е. прошло соединение, по нему прошло 2-3 сообщения, соединение не разывается, но сервер молчит, а клиент ждет. Потом появились новые данные, сервер их в отрытое соединение достал и т.д.
Почитай ссылку про HTTP_Streaming. Там как раз рассказывают как такое делать. Хотя все эти постоянные соединения это страшно некошерный способ :D
Гемороя много(память апача + число соединений + таймауты), а преимуществ по сравнению с Ajax ты получишь мало. Кстати, разработчики XAJAX обещали включить свою реализацию HTTP_Streaming в свой ближайший релиз(0.5). Сейчас у них уже было несколько бета-версий, так что может скоро и розродятся. Тогда не прийдется придумывать велосипед.
досылай в цикле клиенту <!-- --> оно благо и в браузере не отображается =))))))))
а как только пришли новые данные пиши их =) делал я так где-то, но только на Perl и для того чтобы браузер в ожидании не отсох (не больше минут 5ти такое соединение держалось... надо было так :P).
PS: да и в перле есть замечательная штука $! (вывод идёт сразу не дожидаясь пока наберется блок в N байт для посылки :) ) :) а в PHP не знаю как такое реализовывать
В том и дело, что преимущество есть. Это трафик и уменьшение запросов. При чистом аяксе получается что клиенты тергают сервер каждые Х сек. Пусть даже каждые 2 сек... 50 клиентов к примеру... это сколько соединений в секунду? Многова-то ибо вполне может статься, что установка соединения была бесполезной и новых данных нет. А тут у нас соединение уже есть, накладных расходов на установку нового соединения уже не нужно. Насчет памяти... ну в наше время это не проблема + у нас же на сервере висит демон который в принципе занимает практически одно и тоже количество ОЗУ.
Ну первое это то, что отображаться то не отображается, однако трафик то идет. И второе. В PHP у меня так не получилось. Т.е. данные на клиент уходят когда скрипт полность отработал логику. А до тех пор данные не идут. Пытался через буферизацию намутить, но не вышло.
Да, проанализировав всю вашу дискуссию и почитав http://ajaxpatterns.org/HTTP_Streaming, я понял что лучше Flash, в следствии вновь открытого у меня возник ещё вопрос:D :Вы говорите что серверный скрипт может быть закрыт по тайм-ауту следовательно будут закрыты и Socket`ы, получается так, что будет релизовано постоянное соединение, которое будет закрыто, и даже если я заставлю клиент реконектиться, всё равно не смогу т.к socket`ы закрыты? Весело, так, и как мне тогда заного оккрыть Socket или как можно проверить закрытие их?
Одно дело будет закрыт скрипт, который был вызван по веб сервером HTTP запросу. А черз сокеты надо уже коннектиться к своему серверу (пусть и написанному на том же языке), который постоянно запущен и никогда кроме аварийных случаев не закрывается.