推送使用PHP,Ajax和Javascript / jQuery?

我有一个聊天webapp作为客户项目的一部分。

要存储数据,每行都记录在.txt文件中,并且每1000ms调用一次使用Ajax检索数据的Javascript / jQuery函数。

为了防止每秒调用一次函数, 有没有办法让页面被提醒新数据,只有在新数据存在时调用函数

这是我目前的function:

 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('Sending...'); var newscrollHeight = $("#chatContent").innerHeight(); $("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); var clientmsg = $("#usermsg").val(); var chatName = ""; 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 )。 如果您使用的是像Node.js这样的Javascript库,他们会支持这一点。

你需要的是Websocket服务器(实际推动的东西)。 有用于PHP的Websocket服务器(参见1,2,3 )。 和Websocket客户端(Javascript接收“推”并处理它)。 请查看我为进一步研究所包含的链接。

如果您不想使用nodejs,请使用ReactPHP并编写您自己的异步应用程序

这是一个很好的快速入门示例: https : //www.youtube.com/watch?v = 6xrnYae1FU

另一种方法是使用阻塞ajax函数,该函数仅在检测到更改或发生超时时返回。 我已经看到这个想法被称为“伪推”或“长轮询”。 但是,您仍然需要在服务器端执行常规轮询。 它并不完美,但比每秒提出客户请求要好得多。 AFAIK Facebook仍然使用此方法进行聊天,因为尚未广泛支持websockets。