Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: AJAX. Обращение к серверу только при изменении данных
Форумы портала PHP.SU » » Вопросы новичков » AJAX. Обращение к серверу только при изменении данных

Страниц (2): [1] 2 »
 

1. teddy - 26 Июля, 2013 - 01:37:51 - перейти к сообщению
Здравствуйте уважаемые. Помогите пожалуйста реализовать следующее:

Есть скрипт(гостевая книга), данные из которой подгружаются через AJAX. Тоесть при наличии новых сообщений на сервере, страница обновляется и выводятся новые сообщения. Вообщем у меня проблема в том, что я обращаюсь каждый раз через setInterval() к серверу каждую секунду и таким образом вывожу новые сообщения, если они есть.

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

Как можно избавиться от setInterval() и выводить данные только при обновлении информации на сервере? Подозреваю что нужно смотреть в сторону Last Modified, но как это реализовать, я не знаю. Буду рад если поможете. Использую для AJAX js, не jQuery.

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

Спойлер (Отобразить)

Server:
PHP:
скопировать код в буфер обмена
  1.  
  2. header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
  3. echo date("H:i:s");
  4.  
2. DeepVarvar - 26 Июля, 2013 - 01:47:04 - перейти к сообщению
Не с той стороны ты думать начал.
Это сервер должен отправлять ответ только тогда, когда данные изменились http://forum.php.su/topic.php?fo...01915#1331201915
3. teddy - 26 Июля, 2013 - 02:05:19 - перейти к сообщению
DeepVarvar
Спасибо за ссылку, я прочитал твой пост в данной теме, я так понимаю без крона с твоим примером не обойтись? И как по мне то не очень подойдет для гостевой книги или при других задачах в боевых проектах... Информация выводится из БД, насколько я понимаю придется выполнять цикл в цикле что не есть хорошо... Хотя может я твой пост в той теме не очень хорошо понял...

Я представляю себе это приблизительно так:
В output файле проверяем через AJAX посредством HTTP методом HEAD наличие last modified на сервере, если он есть, то запускаем функцию setInterval('getResponse()', 1000);

Если нет last modified, то setInterval() не запускается, скрипт output файла не обращается к серверу.
4. DeepVarvar - 26 Июля, 2013 - 02:12:08 - перейти к сообщению
teddy пишет:
без крона с твоим примером не обойтись?
Какой нахрен крон? Если вася сидит и ждет, а петя напечатал, то в петя для васи будет как твой "крон" которого ты щас придумал себе. Вася немедленно получит петино сообщение потому, что петя пнет файлик который вася слушает. Пока петя не пнул файл, вася в базу не полезет.
5. teddy - 26 Июля, 2013 - 02:19:34 - перейти к сообщению
DeepVarvar
Странно, я код конечно не запускал, но идею в принципе понял, просто пытался недавно написать скрипт "Кто онлайн", и что бы узнать текущую статистику постоянно приходилось обновлять файл(т.е заходить в него), ну как решение - подумал про крон...
Я так понимаю функция filemtime() позволит реализовать сказанное тобой без крона?

Так же хотелось бы получить ответ насчет реализации той идеи что я описал в своем предыдущем посте...
6. DeepVarvar - 26 Июля, 2013 - 02:35:15 - перейти к сообщению
teddy пишет:
Если нет last modified, то setInterval() не запускается, скрипт output файла не обращается к серверу.
А если скрипт уже не запускается по сетинтервалу, а ластмодифиед вдруг произошел - откуда скрипт узнает об этом? Радость

teddy пишет:
Я так понимаю функция filemtime() позволит реализовать сказанное тобой без крона?
Ага. Она таки получит время последнего события.
7. teddy - 26 Июля, 2013 - 02:39:20 - перейти к сообщению
DeepVarvar пишет:
А если скрипт уже не запускается по сетинтервалу, а ластмодифиед вдруг произошел - откуда скрипт узнает об этом?


Наверное можно написать функцию, которая будет setInterval-ом отправлять HEAD запрос и смотреть заголовки

Или проверить в if(req.readyState == 4 && req.readyState == 200) - данные на странице полюбому будут и условие будет true

Вот я не знаю как все это грамотно сделать потому и пришел сюда за помощью ) Хотелось бы получить более развернутый ответ ) Без варианта вывода цикла в цикле
8. DeepVarvar - 26 Июля, 2013 - 02:48:46 - перейти к сообщению
Не знаю где ты там у меня увидел цикл в цикле..
9. teddy - 26 Июля, 2013 - 03:24:32 - перейти к сообщению
DeepVarvar пишет:
Не знаю где ты там у меня увидел цикл в цикле..

Я вывод данных увидел и подумал, что придется в этом цикле писать ещё один цикл для вывода записей из БД. Ведь в твоем примере мы узнаем об изменении файла именно в теле цикла...
(Добавление)
Может я торможу на ночь глядя, поправь если ошибаюсь Растерялся
10. DeepVarvar - 26 Июля, 2013 - 03:33:19 - перейти к сообщению
В теле цикла ты дергаешь только время обновления файлика, а не лезешь в базу.
По ресурсам это абсолютно не критично, т.к. эти данные даже на диск не упадут потому что у харда есть кеш и буфер, в которых он хранит часто используемые данные.
11. quinlena - 26 Июля, 2013 - 07:07:39 - перейти к сообщению
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.
12. teddy - 26 Июля, 2013 - 19:02:18 - перейти к сообщению
quinlena пишет:
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.

Я принцип понимаю, но реализацию не очень.

Кто нибудь может предложить вариант использования AJAX для таких задач? Вроде на многих крупных сайтах это реализовано. Так вот, как решить этот вопрос грамотно? Может кто подсказать примером то, как приблизительно это реализуется с минимальной нагрузкой на сервер?

Очень нужно
13. quinlena - 26 Июля, 2013 - 19:07:42 - перейти к сообщению
teddy пишет:
quinlena пишет:
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.

Я принцип понимаю, но реализацию не очень.

Кто нибудь может предложить вариант использования AJAX для таких задач? Вроде на многих крупных сайтах это реализовано. Так вот, как решить этот вопрос грамотно? Может кто подсказать примером то, как приблизительно это реализуется с минимальной нагрузкой на сервер?

Очень нужно

Примеров в сети куча вот допустим http://skillcoding[dot]com/Default[dot]aspx?id=167
14. teddy - 26 Июля, 2013 - 19:08:43 - перейти к сообщению
quinlena
это JSON да ещё и в jQuery
15. quinlena - 26 Июля, 2013 - 19:10:04 - перейти к сообщению
teddy пишет:
quinlena
это JSON да ещё и в jQuery

Чем плох jquery? Можешь и не json-ом

 

Powered by ExBB FM 1.0 RC1