这个问题的解决方案可以通过一个名为Pusher的应用程序轻松解决,这是一个托管的发布/订阅 API。简而言之,Pusher 提供了两个库,一个用于客户端(订阅者),一个用于服务器(发布者)。
发布者可以是您服务器上的单个脚本(有很多可用的语言)设置为以您希望的任何时间间隔运行。每次运行时,它都会连接到一个通道并发布它生成的任何数据。客户端是通过 Web 应用程序中的一些 JavaScript 创建的,每当用户导航到您的页面时,客户端都会订阅您的服务器脚本发布到的同一频道,并在数据可用时立即接收数据,然后可以操作不管你认为合适。
服务器:
#!/usr/bin/php
<?php
require('Pusher.php');
$dbh = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
foreach($dbh->query('SELECT hostname FROM systems WHERE status = 0') as $row) {
$systems[] = $row['hostname'];
}
$pusher = new Pusher($pusher_key, $pusher_secret, $pusher_app_id);
$pusher->trigger(
'my-channel',
'my-event',
array('message' => implode('<br />', $systems))
);
客户端:
<!DOCTYPE html>
<html>
<head>
<title>Pusher Test</title>
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
<script src="http://js.pusher.com/1.12/pusher.min.js" type="text/javascript"></script>
<script type="text/javascript">
var pusher = new Pusher(key);
var channel = pusher.subscribe('my-channel');
channel.bind('my-event', function(data) {
$('#systems').html(data.message);
});
</script>
</head>
<body>
<div id="systems"></div>
</body
</html>
因此,在这种情况下,无论有多少客户端访问该页面,都只会运行一个数据库查询,并且在每个时间间隔,所有订阅的客户端都将使用新数据进行更新。
还有一个用 Ruby 编写的 Pusher 协议的开源服务器实现,称为Slanger。