8

我正在使用 php+mysql 开发约会中心 Web 应用程序。我目前正在尝试做的是在没有第三方推送器且不使用 jQuery SetInterval AJAX 请求的情况下从 Web 服务器向客户端/用户 Bowers 进行预约时发送通知。我认为 SetInterval & AJAX 是一种不好的方法,因为客户端和服务器之间的流量会太多。

如何在不使用 SetInterval 轮询服务器的情况下实现通知?

4

3 回答 3

14

您可以使用 NodeJs 做到这一点。NodeJS 是您服务器上的 javascript,可将内容实时推送到连接的客户端。

它非常易于使用和设置。您需要一个专用于实时应用程序的服务器,我使用http://nodejitsu.com

服务器端

var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, url = require('url')

app.listen(8080);

function handler (req, res) {
// parse URL
var requestURL = url.parse(req.url, true);

// if there is a message, send it
if(requestURL.query.message)
    sendMessage(decodeURI(requestURL.query.message));

// end the response
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end("");
}

function sendMessage(message) {
io.sockets.emit('notification', {'message': message});
}

客户端

<script src="socket.io.min.js"></script>
<script>
var socket = io.connect('http://localhost:8080');
socket.on('notification', function (data) {
    console.log(data.message);
});
</script>

我在下面添加了@intivev 的易于使用的示例,以完成未来读者的答案

于 2013-05-31T14:56:51.490 回答
5

您可以为此使用 WebSockets,Ratchet是构建在React 库之上的 PHP 实现。我已经在生产应用程序中使用了这两个库,并且对它们非常满意。

是的,使用 node.js 是一种选择,也许是更好的选择 - 取决于您当前的情况。

安东尼。

于 2013-05-31T15:12:22.690 回答
2

我觉得你为此目的选择了错误的语言(PHP),可能有办法在 PHP 中做到这一点,但我很确定它会是一个扭曲的语言。我建议为此目的使用 node.js,因为使用它您可以以更简单的方式将通知推送到客户端

服务器端

var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, url = require('url')

app.listen(8080);

function handler (req, res) {
// parse URL
var requestURL = url.parse(req.url, true);

// if there is a message, send it
if(requestURL.query.message)
    sendMessage(decodeURI(requestURL.query.message));

// end the response
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end("");
}

function sendMessage(message) {
io.sockets.emit('notification', {'message': message});
}

客户端

<script src="socket.io.min.js"></script>
<script>
var socket = io.connect('http://localhost:8080');
socket.on('notification', function (data) {
    console.log(data.message);
});
</script>

因此,如果您使用合适的语言,您会发现它很容易

于 2013-05-31T14:59:48.633 回答