尽管这是一个古老的问题,但我还是把戒指扔在戒指里。对于速度,可靠性和易用性来说,数据库是一个明显的容易选择......有很多人忽略了一个主要的警告,那就是大多数共享主机(最常见的网络托管形式)只允许15或者所以一次连接,即使VPS通常只允许100-200,专用500或更多。这意味着如果你有(n)个用户每秒汇集一次,那么这些连接将快速消失,如果你还运行任何类型的CMS,速度甚至会更快。在VPS上开发自己的聊天室代码时,我自己也面临着这些问题。
到目前为止我的方法就是这样。
- 确保传递lastMessageReceived变量来限制响应。
- 如果公共聊天室通过时间戳过滤器以及上述
- 如果可能的话尽可能使用数据库缓存引擎(如MySQLnd),并启用查询缓存并将TTL设置为您的池化速率。
- 不要让你的游泳池速度变得疯狂1-2秒的间隔可能看起来很整洁,但它会杀死你的连接数。将其降低到5秒甚至更多不会真的产生巨大的差异,用户可能不会注意到,并且您的服务器负载会轻得多。甚至考虑在高负荷期间自身产生的变化汇集率。
- 编写您的ajax使用超时而不是时间间隔为其池并将超时调用放置在ajax成功回调中,这可以防止请求在峰值ussage期间堆叠起来。
- 而最大的一个,如果使用与许多用户共享的聊天室,编写自己的代码来将SQL查询缓存到json文件并将其提供给ajax请求,并编写一些自定义TTL代码来检查其年龄和重新 - 在请求期间根据需要填充它,如果您的主机允许,CRON会很棒。年龄检查文件并重定向AJAX请求是一个更高级别的功能,与查询数据库相比,它的服务器开销非常小。并且不要在PHP中解析文件来筛选旧邮件,将第一条邮件中的第一条邮件存储在文件名中,如
chat_243.json
,并将其保存为已格式化的json,然后在请求进入php与lastMessageReceived = 243
。由于这会创建多个文件,因此您需要一个清理超过(m)分钟的文件的功能,但这对于服务器来说也是轻量级的工作。
也有像DB引擎专为聊天和插座(node.js的)的选项,但那些需要更多的服务器的调整比典型的托管帐户允许,我的目的,我一直在写记住我的聊天室保管它可能会在某个时候被部署到共享服务器上。
这里是我目前使用的代码,它已几乎让我到我的聊天扩大到无限数量的
$cacheFile = 'cache/chat_'.$_GET['last'].'.json';
if (file_exists($cacheFile) && filemtime($cacheFile) + QUERY_REFRESH_RATE > time())
{
readfile($cacheFile);
} else {
require_once("../../../../wp-load.php");
$timestampMin = gmdate("Y-m-d H:i:s", (time() - 7200));
$sql= "/*qc=on*/" . "SELECT * FROM ". DB_TABLE ."chat_posts WHERE ID > ". $_GET['last'] . " AND timestamp > '".$timestampMin."' ORDER BY ID;";
$posts = $wpdb->get_results($sql);
$json = json_encode($posts);
echo $json;
file_put_contents($cacheFile,$json);
}
关于使用SQLite是什么(在服务器带宽)连接? – 2011-06-11 07:19:48
可能将聊天保存在数组中,并且当聊天关闭时,将它写入文本文件 – 2011-06-11 07:20:51
您可以以某种方式连接池吗?这可能会提高你的速度。 – 2011-06-11 07:21:25