У меня есть веб-приложение Chat как часть проекта для клиента.
Для хранения данных каждая строка записывается в файл .txt
а функция Javascript / jQuery, использующая Ajax
для извлечения данных, вызывается каждые 1000 мс.
Чтобы предотвратить функцию, вызываемую каждую секунду, есть ли способ, чтобы страница была предупреждена о новых данных и только вызывала функцию, когда существуют новые данные ?
Вот моя текущая функция:
setInterval (loadLog, 1000); function loadLog(){ var chatCode = $('input#chatCode').val(); var oldscrollHeight = $("#chatContent").innerHeight(); var oldNum = $('#chatContent>div').length; $.ajax({ url: "sessions/chats/log_"+chatCode+".html", cache: false, success: function(html){ $('#chatContent').html(makePretty(html)); } //Auto-scroll var newscrollHeight = $("#chatContent").innerHeight(); //Scroll height after the request if(newscrollHeight > oldscrollHeight){ $("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); } } }) }
И отправить данные:
$('form#chatSubmit').submit(function(e){ var chatCode = $('input#chatName').val(); $('#chatContent').append('<span id="sending">Sending...</span>'); var newscrollHeight = $("#chatContent").innerHeight(); $("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); var clientmsg = $("#usermsg").val(); var chatName = "<?php echo $_SESSION['code']; ?>"; var chatData = [clientmsg,chatName,chatCode]; var jsonChatData = JSON.stringify(chatData); $.post("inc/chatpost.php", { text: clientmsg, name: chatName, code: chatCode }) .done(function(data){ //console.log(data); }); $("#usermsg").val(''); return false; e.preventDefault(); });
Есть способ, но для этого потребуется переписать приложение. Этот протокол называется Websockets (см. 1 , 2 , 3 ). Если вы используете библиотеку Javascript, такую как Node.js, у них есть поддержка для этого.
Вам понадобится сервер Websocket (то, что на самом деле толкает). Для PHP есть серверы Websocket (см. 1 , 2 , 3 ). И клиент Websocket (Javascript, который получает «push» и обрабатывает его). Пожалуйста, ознакомьтесь со ссылками, которые я включил для дальнейших исследований.
используйте ReactPHP и напишите свое собственное асинхронное приложение, если вы не хотите использовать nodejs
вот пример nice quickstart: https://www.youtube.com/watch?v=s6xrnYae1FU
Другой способ – использовать функцию блокирования ajax, которая возвращается только при обнаружении изменений или таймауте. Я видел эту идею, называемую «псевдо-толчок» или «длительный опрос». Однако вам все равно придется делать обычную опросную информацию на стороне сервера. Это не идеально, но намного лучше, чем запрос клиента каждую секунду. AFAIK Facebook по-прежнему использует этот метод для своего чата, потому что веб-узлы еще не получили широкого распространения.