我想从一个phonegap应用程序中对我的服务器上的脚本进行长时间轮询,以检查服务消息,优惠等内容.
我在js中使用这种技术:
(function poll(){ $.ajax({ url: "/php/notify.php", success: function(results){ //do stuff here }, dataType: 'json', complete: poll, timeout: 30000, }); })();
这将每5分钟开始一次新的民意调查(当应用程序'暂停'时将停止轮询以避免额外负载)
我不知道如何设置PHP虽然?我可以设置它,所以它不返回任何东西,只是循环通过脚本,但如何我一旦决定向应用程序发送消息,它会立即返回响应?到目前为止我的PHP代码是:
0){ //if the data variable exists (from the included file) then send the message back to the app if($message != ''){ // Break out of while loop if we have data break; } } //if we get here weve broken out the while loop, so we have a message, but make sure if($message != ''){ // Send data back print(json_encode($message)); } ?>
message.php包含一个$ message变量(数组),它通常是空白但是在我想要的时候会包含数据.问题是,当我更新message.php中的$ message var时,它不会将响应发送回应用程序,而是等待它超时并且poll()函数再次启动.
所以我的问题是,我如何设置PHP所以我可以更新我的服务器上的消息,它会立即发送给任何民意调查?
长轮询实际上是非常耗费资源的
你遇到的问题是它每秒都在不断地打开一个连接,在我看来这是非常低效的.根据您的情况,有两种方法可以满足您的需求; 使用的首选方式web sockets
(我将解释两者):
服务器已发送事件
为了避免使用效率低下的Ajax超时代码,您可能需要查看Server Sent Events,这是一种旨在为您处理"长轮询"的HTML5技术.以下是它的工作原理:
在JS中:
var source = new EventSource("/php/notify.php"); source.onmessage=function(event) { document.getElementById("result").innerHTML+=event.data + "<br>"; };
在PHP中:
您可以使用SSE API接口发送通知和消息.我手头没有任何代码,但是如果你想让我创建一个例子,我会用它来更新这个答案
这将导致Javascript每秒长时间轮询端点(您的PHP文件),监听服务器发送的更新.有点低效,但它的工作原理
的WebSockets
Websockets完全是另一个球赛,真的很棒
Long-Polling和SSE的工作是不断向服务器打开新请求,"监听"生成的任何信息.问题是这是非常耗费资源的,因此效率很低.解决这个问题的方法是打开一个称为Web套接字的持续连接
StackOverflow,Facebook以及您在这些服务上享受的所有其他"实时"功能都是通过Web套接字处理的,它们的工作方式与SSE完全相同 - 它们在Javascript中打开连接并收听来自服务器
虽然我们从未对任何websocket技术进行硬编码,但到目前为止,建议您使用第三方套接字服务之一(可靠性和可扩展性).我们最喜欢的是Pusher