2014-06-22 160 views
11

我怎么能发送邮件从服务器到客户端,使用PHP,避免多余的Ajax调用。从服务器发送通知到客户端服务器上的事件

这里的理念是:

  1. 用户:爱丽丝使得它被发送到服务器的变化。

  2. 服务器然后检查以查看哪些用户不是最新的,并且如果没有调用一些代码以将关于该改变的信息发送给Bob(在这种情况下谁不是最新的)。

如何向Bob发送消息?

+2

如果您对Stack Exchange使用的确切工具和技术感兴趣,那么[Meta Stack Exchange上的这个问题](http://meta.stackexchange.com/questions/10369/which-tools-and-technologies-被用来建立堆栈交换网络)将对你有用。就实际实现具有类似功能的东西而言,这个问题太广泛了。 – animuson

+0

调查[Ajax](https://en.wikipedia.org/wiki/Ajax_(programming))。 –

+2

@MthethewStrawbridge阅读文章,我谈论为什么这是行不通的。 – user3765372

回答

17

您可以使用Server Sent Events

这些都是重量更轻,单向的websockets常常看起来表兄弟。他们基本上是允许客户端等待来自服务器的消息

示例客户端代码(然后你就可以通过不同的渠道,如AJAX回应):

var source = new EventSource('/newFile'); 

source.addEventListener('message', function(e) { 
    // Use AJAX and pull new file here 
}, false); 

Unfortuantely看来(当然)那有no IE support。可以使用库如EventSource HQ来支持跨浏览器服务器发送的事件。它会抽象出需要处理魔鬼的浏览器。

+0

Polyfills for http://www.w3.org/TR/eventsource/ - https://github.com/Yaffle/EventSource&https://github.com/remy/polyfills/blob/master/EventSource.js。当然,除IE之外,上面的这些作品还不多。 – user3257644

8

正如在评论中,你正在寻找的技术是WebSockets说。它们是您在服务器和Web浏览客户端之间安装套接字(一种用于必需的双向管道的unix术语)的一种方式。

尽管人们可以用生的WebSocket API工作。我更喜欢使用像Socket.IO这样的图书馆来为我抽象出令人讨厌的细节。

在通常情况下(假设您使用节点)安装包后Socket.IO为您提供了许多不同的简单方法,例如事件和广播集成到您的应用程序中。你也可以使用它作为一个just a cross browser websocket(它实现回退长轮询不支持WebSockets的浏览器)。

对于您的情况,您希望在服务器上更改文件时,将消息从服​​务器发送到客户端。

一个服务器端(Node.js的):

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.on('message', function() { }); 
    socket.on('disconnect', function() { }); 

    // more stuff here 
    if(somethingChanged) { 
    socket.send(JSON.stringify({changed: true, file: 'file1.txt', newContent: 'Im fresh off the press yo!'}); 
    } 
}); 

对于客户端:

<script> 
    var socket = io('http://localhost/'); 
    socket.on('connect', function() { 
    socket.send('anything-new'); 

    socket.on('message', function (msg) { 
     if(JSON.parse(msg).changed) { 
     // Do stuff here 
     } 
    }); 
    }); 
</script> 

虽然这是一个非常裸露的例子是希望足以让你开始。

13

您正在寻找的东西是(现在)很常见的东西,有时称为“实时网络”。这就是让您的服务器端代码实时向连接的客户端推送内容的能力。

这可以通过一些新的机制来实现,这些机制是由最新的浏览器(和服务器)支持的,还有一些其他的机制并不是真正被设计成这样做的,但它可以被用作“黑客”这行得通。

你必须明白的第一件事是,你所要求的(服务器将消息推送到客户端)并不是网络(或至少http)是(或更好的))打算工作。 经典网页是无状态的请求响应半双工:客户端启动通信,打开与服务器的连接,服务器提供服务,连接关闭。 以前没有办法让服务器向Web客户端发送消息:客户端(即您的浏览器)应该支持反向模型(提供它所监听的端点),从而成为服务器。

这是,或多或少,什么样的WebSockets报价较新的标准(另一种标准值得一提的是Server-sent events (SSE);但是,它支持比WebSockets的更是凤毛麟角,他们似乎更倾向于以“流”的内容不是发送单个消息) 。

与HTTP不同,WebSocket提供了全双工通信(任何一方都可以启动它),这正是您正在寻找的。 WebSocket协议(旧的,马车在执行某些浏览器存在)的正确版本的Firefox 6,Safari浏览器6,谷歌Chrome 14,歌剧12.10和Internet Explorer 10

所以,如果你的浏览器不实施不支持WebSockets?你必须使用我前面提到的那些“技巧”。那些“诡计”属于Push technologies的unbrella。

特别是,一种常用的技术是长轮询。 就像名字所说,它不是“推”的;长轮询是轮询,即“拉”技术,但它允许模拟推送机制。 通过长时间轮询,客户端可以像在普通的AJAX调用中一样请求服务器的信息,除了它以慢得多的频率发出HTTP/S请求(轮询)。在连接时,服务器(你的服务器,你的API:一个servlet,一个HTTP处理程序,一个REST控制器,无论如何!它通常与你提供对标准AJAX调用的支持相同的机制)发送一些信息if已经有可用的更新;如果没有新的东西,而不是发送空的响应,它将保持请求打开并等待响应信息变为可用。

您有一个“传统的”客户端启动的请求,但这是“搁置”,直到有一些服务器想与您通信。 一旦出现问题,服务器会向客户端发送响应(通过HTTP通道,仍然打开!),完成打开的HTTP请求。

可以使用其他技术(例如使用由插件提供的套接字--Silverlight,Java applets,Flash ..),但是为了利用它们,您需要正确的客户端(浏览器/插件组合)。

当然,你可以自己实现所有这些东西。我鼓励你试试作为学习练习。 (对于ASP.NET)Ratchet(对于PHP),Signal.IO(对于节点。)对于您的生产代码,最好使用封装所有这些概念和技术的库,如SignalR(用于ASP.NET)Ratchet(用于PHP),Signal.IOjs),Faye(用于Ruby)....这些库中的一些将实现多种技术,根据客户端选择最佳技术,自动回退到其他技术。他们真的给你带来了很多麻烦!

相关问题