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. Обращение к серверу только при изменении данных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
teddy
Отправлено: 26 Июля, 2013 - 01:37:51
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Здравствуйте уважаемые. Помогите пожалуйста реализовать следующее:

Есть скрипт(гостевая книга), данные из которой подгружаются через 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.  
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июля, 2013 - 01:47:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Не с той стороны ты думать начал.
Это сервер должен отправлять ответ только тогда, когда данные изменились http://forum.php.su/topic.php?fo...01915#1331201915
 
 Top
teddy
Отправлено: 26 Июля, 2013 - 02:05:19
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DeepVarvar
Спасибо за ссылку, я прочитал твой пост в данной теме, я так понимаю без крона с твоим примером не обойтись? И как по мне то не очень подойдет для гостевой книги или при других задачах в боевых проектах... Информация выводится из БД, насколько я понимаю придется выполнять цикл в цикле что не есть хорошо... Хотя может я твой пост в той теме не очень хорошо понял...

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

Если нет last modified, то setInterval() не запускается, скрипт output файла не обращается к серверу.
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июля, 2013 - 02:12:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




teddy пишет:
без крона с твоим примером не обойтись?
Какой нахрен крон? Если вася сидит и ждет, а петя напечатал, то в петя для васи будет как твой "крон" которого ты щас придумал себе. Вася немедленно получит петино сообщение потому, что петя пнет файлик который вася слушает. Пока петя не пнул файл, вася в базу не полезет.
 
 Top
teddy
Отправлено: 26 Июля, 2013 - 02:19:34
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DeepVarvar
Странно, я код конечно не запускал, но идею в принципе понял, просто пытался недавно написать скрипт "Кто онлайн", и что бы узнать текущую статистику постоянно приходилось обновлять файл(т.е заходить в него), ну как решение - подумал про крон...
Я так понимаю функция filemtime() позволит реализовать сказанное тобой без крона?

Так же хотелось бы получить ответ насчет реализации той идеи что я описал в своем предыдущем посте...
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июля, 2013 - 02:35:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




teddy пишет:
Если нет last modified, то setInterval() не запускается, скрипт output файла не обращается к серверу.
А если скрипт уже не запускается по сетинтервалу, а ластмодифиед вдруг произошел - откуда скрипт узнает об этом? Радость

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


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DeepVarvar пишет:
А если скрипт уже не запускается по сетинтервалу, а ластмодифиед вдруг произошел - откуда скрипт узнает об этом?


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

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

Вот я не знаю как все это грамотно сделать потому и пришел сюда за помощью ) Хотелось бы получить более развернутый ответ ) Без варианта вывода цикла в цикле

(Отредактировано автором: 26 Июля, 2013 - 02:40:15)

 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июля, 2013 - 02:48:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Не знаю где ты там у меня увидел цикл в цикле..
 
 Top
teddy
Отправлено: 26 Июля, 2013 - 03:24:32
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DeepVarvar пишет:
Не знаю где ты там у меня увидел цикл в цикле..

Я вывод данных увидел и подумал, что придется в этом цикле писать ещё один цикл для вывода записей из БД. Ведь в твоем примере мы узнаем об изменении файла именно в теле цикла...
(Добавление)
Может я торможу на ночь глядя, поправь если ошибаюсь Растерялся
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июля, 2013 - 03:33:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




В теле цикла ты дергаешь только время обновления файлика, а не лезешь в базу.
По ресурсам это абсолютно не критично, т.к. эти данные даже на диск не упадут потому что у харда есть кеш и буфер, в которых он хранит часто используемые данные.
 
 Top
quinlena
Отправлено: 26 Июля, 2013 - 07:07:39
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.
 
 Top
teddy
Отправлено: 26 Июля, 2013 - 19:02:18
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




quinlena пишет:
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.

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

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

Очень нужно

(Отредактировано автором: 26 Июля, 2013 - 19:05:32)

 
 Top
quinlena
Отправлено: 26 Июля, 2013 - 19:07:42
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




teddy пишет:
quinlena пишет:
Похожее делала. Обновление делается после создания записи. Сделал запись, после сразу обновление того, чего нужно. Делала с комментами и с письмами. По началу тоже setinterval использовала.

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

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

Очень нужно

Примеров в сети куча вот допустим http://skillcoding[dot]com/Default[dot]aspx?id=167
 
 Top
teddy
Отправлено: 26 Июля, 2013 - 19:08:43
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




quinlena
это JSON да ещё и в jQuery
 
 Top
quinlena
Отправлено: 26 Июля, 2013 - 19:10:04
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




teddy пишет:
quinlena
это JSON да ещё и в jQuery

Чем плох jquery? Можешь и не json-ом
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB