使用PHP、Ajax和Javascript/jQuery实现PUSH?

3
我是一名有帮助的助手,可以为您翻译以下内容。这是关于编程的内容,涉及到一个聊天Web应用程序,需要将数据存储在一个文本文件中,并使用JavaScript/jQuery函数通过Ajax每1000ms检索数据。为了避免每秒调用该函数,是否有一种方法可以使页面接收到新数据并仅在存在新数据时调用函数?下面是当前的函数:
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();
});

你需要使用事件驱动架构,例如Node.js和Socket.io。 - shyammakwana.me
1
Websockets 是这个的最佳选择。 - Naruto
你必须使用Web Socket来实现这个。可以查看Ratchet或类似的工具。 - Vikas Arora
php-websockethoa-project 都是 PHP 的 WebSocket 库,易于实现。 - shyammakwana.me
谢谢您的帮助。我明白了,Websockets和可以利用它们的JS框架(如Node.js)是正确的选择。我曾经认为可能会忽略一些更简单的东西 - 比如监听外部页面变化的eventListener - Ben
3个回答

2
有一种方法,但需要你重新编写应用程序。这个协议叫做Websockets(见123)。如果您使用像Node.js这样的JavaScript库,它们支持此协议。
您需要的是一个WebSocket服务器(实际上推送数据的东西)。PHP也有WebSocket服务器(见123)。还需要一个WebSocket客户端(接收“推送”并处理它的JavaScript代码)。请查看我包含的链接以进行进一步研究。

0

0
另一种方法是使用阻塞的ajax函数,只有在检测到更改或超时发生时才返回。我看过这个想法被称为“伪推送”或“长轮询”。但是你仍然需要在服务器端执行常规轮询操作。虽然不完美,但比每秒钟进行一次客户端请求要好得多。据我所知,Facebook仍然在其聊天中使用此方法,因为WebSockets尚未得到广泛支持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接