【发布时间】:2014-01-24 08:21:20
【问题描述】:
我已经设计了一个类似于 Spoj 和 Codeforces 的编码平台,用于在我的大学在 LAN 上组织比赛。
我在那里使用了长轮询,以便管理员的任何公告都可以通过 JavaScript 警报消息广播给所有用户。当论坛上发布任何内容时,管理员也会收到通知。
但只有 16 名用户(包括 1 名管理员)访问该站点,服务器出现故障并显示 too many sql connections。我重新启动了我的笔记本电脑(服务器),它持续了一段时间,然后又宕机了;给出与以前相同的错误消息。
当我删除两个长轮询过程后,一切都顺利进行。
服务器端长轮询代码:
include 'dbconnect.php';
$old_ann_id = $_GET['old_ann_id'];
$resultann = mysqli_query($con,"SELECT cmntid FROM announcements ORDER BY cmntid DESC LIMIT 1");
while($rowann = mysqli_fetch_array($resultann)){
$last_ann_id = $rowann['cmntid'];
}
while($last_ann_id <= $old_ann_id){
usleep(10000000);
clearstatcache();
$resultann = mysqli_query($con,"SELECT cmntid FROM announcements ORDER BY cmntid DESC LIMIT 1");
while($rowann = mysqli_fetch_array($resultann)){
$last_ann_id = $rowann['cmntid'];
}
}
$response = array();
$response['msg'] = 'new';
$response['old_ann_id'] = $last_ann_id;
$resultann = mysqli_query($con, "Select announcements from announcements where cmntid = $last_ann_id");
while($rowann = mysqli_fetch_array($resultann)){
$response['announcement'] = $rowann['announcements'];
}
echo json_encode($response);
【问题讨论】:
-
你设置的最大连接数是多少?如果您进行长轮询的并发用户数接近该数量,那么您可能会用完连接,并且最好在轮询之间断开与数据库的连接。另一方面,您可能会遇到为每个用户触发多个轮询脚本的问题,每个用户都有一个连接。
-
@Kickstart:我应该怎么做才能克服这个问题。允许的最大连接数应该是多少?对于第二种情况,即克服“触发多个轮询脚本......”该怎么办?我对此完全陌生。请解释
标签: mysql long-polling