Добрый вечер коллеги. Ну вобщем нужно написать скрипт на ajax который каждые 10 секунд будет делать запрос в бд потом сравнивать его с количеством строчек в бд с предидущим запросом и в зависимости от ответа выводить новую инфу или нет. Это нужно для чата. Если я иду в правильном направлениее то подкинте примеры кода. Если нет поправьте меня.
@Dron-Boy, ajax грузит сервер сильно, поэтому для этих целей советуют присмотреться к сокетам php http://secure.php.net/manual/ru/book.sockets.php
не сказал бы. --- Добавлено --- @Dron-Boy ajax не общается с базой данных напрямую, тебе нужно почитать как работает ajax. Смысл аякса в том чтобы передать данные, на какой то обработчик на php, и вернуть результат выполнения скрипта динамично без перезагрузки страницы. Грубо говоря смотри картинку, вот весь твой алгоритм действий. --- Добавлено ---
Как он работает я знаю. Как мне реализовать так что бы Аякс функция обращались к файлу обработчик и вытягивала от туда данные автоматически? Там например через каждые 10 секунд.
Для этого нужно использовать интервал setInterval. Код (Javascript): function post() { $.post('url', { key: 'value' },function(data) { console.log(data); }); } setInterval(post, 10000); Но для более правильного решения, нужно юзать протокол ws - для работы с постоянным соединением.
@Dron-Boy гугл в помощь --- Добавлено --- @Dron-Boy или вот на сразу на хабре про время на js с помощью jquery https://habrahabr.ru/post/42809/ --- Добавлено --- @Dron-Boy в поддержку @rodent90 https://learn.javascript.ru/settimeout-setinterval --- Добавлено --- Это смотря какие объёмы информации обновляются, и из каких объёмов если у него чат без полного сохранения истории. Ну я бы сделал чат, что 100 сообщений например видно в истории, а после она складывается в другую таблицу бд, для отдельного конкретного пользователя чата, только с его ником, ну расфасовку по пользователям тупо в тексте. то есть таблица имела бы вид id message 1 nick:ewfwegfwg;nick:ewfwegwgg;nick:wgwegwgwg;nick:efefgwegwegweg; 2 nick:ewfwegfwg;nick:ewfwegwgg;nick:wgwegwgwg;nick:efefgwegwegweg; 3 nick:ewfwegfwg;nick:ewfwegwgg;nick:wgwegwgwg;nick:efefgwegwegweg; 4 nick:ewfwegfwg;nick:ewfwegwgg;nick:wgwegwgwg;nick:efefgwegwegweg; где в message будет хранится, что говорили пользователю этому либо он что-то говорил. и там уже дальше джоином выводишь историю для конкретного пользователя, смешивая таблицу пользователей и эту. Вот и вся задача. А для всех история тупо вон, херачится 100 сообщений. в общем чате... Ну или если надо кто то может сделать запрос к истории сообщений например чата за вчера и хранится она в ещё одной таблице и всё... или вообще в файле, подгрузил файл и всё... И было бы норм, и никаких сокетов, а аякс 100 сообщений как миленький грузить будет.
@askanim Обьясни немного. Вот я делаю ajax запрос на файл обработчик он дастает записи из бд. И потом что он может мне вернуть целый большой блок с выводом всех сообщений или только можно вернуть переменные с их значениями?
Ты программист, и сам решаешь, что вернуть. Можно большой блок с выводом сообщений, можно JSON-чик с сообщениями, можно выводить только новые сообщения. Зависит от того, что ты потом на стороне клиента со всем этим делать будешь.
мне нужно выводить новые сообщения только. Тогда я делаю так делаю запрос в бд выбераю оттуда данные с условиями потом подставляю их в html код и с помощью echo вывожу. А в файле где ajax запрос я $("#information").text(html); и оно будет выводить?
здесь вопрос скорее в другом - чат будет крутиться на vps или на хостинге. если на хостинге - взять довольно популярный AjaxChat - на хостинге регру с средним тарифным планом - при сидящих в чате 15 человеках - хостинг начинает засыпать письмами с уведомлением о превышении лимита нагрузки на Cpu - хотя в базе хранится, примерно, 50 последних сообщений.
интересно, кстати, а если шаред с ssh доступом? получается, вроде, можно выполнить запуск сокета... хотя да, long pulling достаточно будет
да в принципе - vps сейчас стоит столько же сколько и шаред с ssh, так что это я так - в порядке бреда.
@Dron-Boy Чувак берёшь в бд вешаешь поле и с дата cyrent timestamp и по нему order by asc и выводишь 100 постоянно. можешь хоть html код обратно возвращать не страшно.
@Dron-Boy, если не хочешь или нет возможности поднять сокеты - то как вариант, без сильной нагрузки, можно убивать интервал - если пользователь завис на странице, а когда начнет к примеру двигать мышкой - запускать интервал через 3 сек., в течении 10 сек. если дергает мышкой. setTImeout делать на событии мышки для срабатывания 1 раз, а setInterval на обновление содержимого в чате. Как-то давно делал наверно в 2010, когда еще не было js-ws протокола, приходилось морочиться с такой вот ерундой, ради смеха, так-как лучше было ставить nod'у и не париться, но эта хрень умудрялась работать, жаль найти не могу, кинул бы прям целиком все равно хлам. Сейчас востребованы веб-сокеты, по этому перебрался на них - задачи решаемы и радует, что наконец стандартизировано.