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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: AJAX. Обращение к серверу только при изменении данных
Есть скрипт(гостевая книга), данные из которой подгружаются через AJAX. Тоесть при наличии новых сообщений на сервере, страница обновляется и выводятся новые сообщения. Вообщем у меня проблема в том, что я обращаюсь каждый раз через setInterval() к серверу каждую секунду и таким образом вывожу новые сообщения, если они есть.
Данный способ меня не устраивает тем, что когда пользователь хочет ввести новое сообщение, естественно что за секунду он его не введет, происходит повторное обращение к серверу т.к срабатывает setInterval и все, что успел ввести пользователь за эту секунду(если успел), стирается. Это одно. Во вторых не хочется загружать сервер запросами особенно когда нет обновлений.
Как можно избавиться от setInterval() и выводить данные только при обновлении информации на сервере? Подозреваю что нужно смотреть в сторону Last Modified, но как это реализовать, я не знаю. Буду рад если поможете. Использую для AJAX js, не jQuery.
Что бы вы не гадали(те, кто захочет помочь), я приведу простой пример с часиками, а вы в свою очередь если не сложно, внесите корректировки в скрипт на основе вышеуказанных вопросов, представив что данный скрипт запрашивает с сервера не текущее время, а сообщения из гостевой книги но только в случае, если были новые записи.
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DeepVarvar
Спасибо за ссылку, я прочитал твой пост в данной теме, я так понимаю без крона с твоим примером не обойтись? И как по мне то не очень подойдет для гостевой книги или при других задачах в боевых проектах... Информация выводится из БД, насколько я понимаю придется выполнять цикл в цикле что не есть хорошо... Хотя может я твой пост в той теме не очень хорошо понял...
Я представляю себе это приблизительно так:
В output файле проверяем через AJAX посредством HTTP методом HEAD наличие last modified на сервере, если он есть, то запускаем функцию setInterval('getResponse()', 1000);
Если нет last modified, то setInterval() не запускается, скрипт output файла не обращается к серверу.
DeepVarvar
Отправлено: 26 Июля, 2013 - 02:12:08
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
teddy пишет:
без крона с твоим примером не обойтись?
Какой нахрен крон? Если вася сидит и ждет, а петя напечатал, то в петя для васи будет как твой "крон" которого ты щас придумал себе. Вася немедленно получит петино сообщение потому, что петя пнет файлик который вася слушает. Пока петя не пнул файл, вася в базу не полезет.
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DeepVarvar
Странно, я код конечно не запускал, но идею в принципе понял, просто пытался недавно написать скрипт "Кто онлайн", и что бы узнать текущую статистику постоянно приходилось обновлять файл(т.е заходить в него), ну как решение - подумал про крон...
Я так понимаю функция filemtime() позволит реализовать сказанное тобой без крона?
Так же хотелось бы получить ответ насчет реализации той идеи что я описал в своем предыдущем посте...
DeepVarvar
Отправлено: 26 Июля, 2013 - 02:35:15
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
teddy пишет:
Если нет last modified, то setInterval() не запускается, скрипт output файла не обращается к серверу.
А если скрипт уже не запускается по сетинтервалу, а ластмодифиед вдруг произошел - откуда скрипт узнает об этом?
teddy пишет:
Я так понимаю функция filemtime() позволит реализовать сказанное тобой без крона?
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DeepVarvar пишет:
А если скрипт уже не запускается по сетинтервалу, а ластмодифиед вдруг произошел - откуда скрипт узнает об этом?
Наверное можно написать функцию, которая будет setInterval-ом отправлять HEAD запрос и смотреть заголовки
Или проверить в if(req.readyState == 4 && req.readyState == 200) - данные на странице полюбому будут и условие будет true
Вот я не знаю как все это грамотно сделать потому и пришел сюда за помощью ) Хотелось бы получить более развернутый ответ ) Без варианта вывода цикла в цикле
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DeepVarvar пишет:
Не знаю где ты там у меня увидел цикл в цикле..
Я вывод данных увидел и подумал, что придется в этом цикле писать ещё один цикл для вывода записей из БД. Ведь в твоем примере мы узнаем об изменении файла именно в теле цикла... (Добавление)
Может я торможу на ночь глядя, поправь если ошибаюсь
DeepVarvar
Отправлено: 26 Июля, 2013 - 03:33:19
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
В теле цикла ты дергаешь только время обновления файлика, а не лезешь в базу.
По ресурсам это абсолютно не критично, т.к. эти данные даже на диск не упадут потому что у харда есть кеш и буфер, в которых он хранит часто используемые данные.
Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012 Откуда: Казахстан
Помог: 0 раз(а)
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.
teddy
Отправлено: 26 Июля, 2013 - 19:02:18
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
quinlena пишет:
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.
Я принцип понимаю, но реализацию не очень.
Кто нибудь может предложить вариант использования AJAX для таких задач? Вроде на многих крупных сайтах это реализовано. Так вот, как решить этот вопрос грамотно? Может кто подсказать примером то, как приблизительно это реализуется с минимальной нагрузкой на сервер?
Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012 Откуда: Казахстан
Помог: 0 раз(а)
teddy пишет:
quinlena пишет:
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.
Я принцип понимаю, но реализацию не очень.
Кто нибудь может предложить вариант использования AJAX для таких задач? Вроде на многих крупных сайтах это реализовано. Так вот, как решить этот вопрос грамотно? Может кто подсказать примером то, как приблизительно это реализуется с минимальной нагрузкой на сервер?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.