我试图在php-mysql(和jQuery)中构建一个实时更新的系统。 我的问题是,如果我使用的方法是好的/正确的,或者我应该研究另一种方法:
使用jQuery和AJAX我做了:
setInterval(function() {
Ajax('check_status.php');
},4000);
在check_status.php中的我使用memcache来检查结果是1还是0
$memcache = new Memcache;
$memcache->connect('127.1.0.1', 11211) or die ("");
$userid.$key = md5($userid."live_feed");
$result = $memcache->get($userid.$key);
if($result==1) {
doSomething();
}
这个想法是用户A做了一些事情,并为用户B更新了memcache。 然后通过jQuery每4秒检查一次内存缓存,这样我就可以对用户B进行live_feed。
我使用memcache的原因是限制mysql_queries,从而限制数据库的负载。
所以问题是。我完全不在这里吗?有没有更好的方法来减少服务器负载?
谢谢
答案 0 :(得分:0)
我宁愿使用内容的版本ID。例如,说检索用户A的内容并将版本ID设置为1000.然后将其保存在使用密钥userA_1000的memcached中。 如果用户B的操作或任何其他操作影响用户A的内容,则版本ID将重置为1001。 当您下次检查memcached时,您现在将检查密钥userA_1001,该密钥不存在并将告知您它已更新。因此,重新创建内容,保存在memcached中并使用Ajax请求发回。 用户版本密钥也可以保存在memcached中,以便每次都不进行数据库查询。 所以
User A's key/val --- user_a_key => userA_1001
User A's content --- userA_1001 => [Content]
如果更改已经影响了用户A的内容,只需更改版本并更新备忘录中的内容密钥
User A's key/val --- user_a_key => userA_1002
因此,下次您的Ajax请求在memcached中查找用户内容时,会注意到关键userA_1002没有任何保存,这将提示它重新创建内容。如果它被发现只是回应说不需要更新任何东西。
使用精心设计的类方法来处理内容的更新时间和方式以及密钥的无效方式。
答案 1 :(得分:0)
服务器上的负载将会非常粗糙,因为每个用户每4秒钟就会访问您的Web服务器。如果我是你,我会考虑另外两个选择。
选项1 ,在我看来,两者中较好的是 Websockets 。 Websockets允许服务器和客户端之间的持久通信。可以使用PHP或其他方法创建Web套接字服务器。然后,您可以让所有客户端连接到同一个Web套接字,并将数据发送到所有连接的客户端。在客户端,这是通过不支持Websockets的旧浏览器的Javascript和flash后备来完成的。
选项2 是一项名为长轮询的技术。现在,无论如何,您的客户必须每4秒点击一次Web服务器。在长轮询中,客户端发送ajax请求,并且您不会从服务器返回响应,直到您的memcache状态发生更改。所以基本上你把你现在拥有的代码放在while循环中,暂停以防止它占用100%的服务器资源,并且只有在某些内容发生变化时才运行doSomething()
。然后在客户端获得响应时,启动一个新的ajax调用,再次等待新的响应。因此,当您使用目前所拥有的内容时,无论活动如何,用户都会在一分钟内点击服务器15次,在此方法中,用户只有在每次有实际活动时才会点击服务器。所以这通常可以为你节省大量无用的连接。
查看这两个选项,看看哪种选项在您的情况下会更好。长轮询更容易实现,但效率不高。