我有一个php / mysql拍卖网站,它使用while / break循环来检查项目表中使用ajax轮询的当前活动项目。如果有新的出价或新的批次,它会中断。服务器脚本是:
if ($action == "ping"){
$idle_lot = $_POST['lot'];
$idle_bid = $_POST['bid'];
$timeout = 15;
$now = time();
while((time() - $now) < $timeout) {
$get_bid_status = $db->prepare("SELECT current_bid, lot_number FROM ".$lots_table." WHERE lot_status='active' LIMIT 1");
$get_bid_status->execute(array());
$existCount = $get_bid_status->rowCount();
if ($existCount > 0 ) {
while($row = $get_bid_status->fetch()) {
$current_bid = $row["current_bid"];
$lot_number = $row["lot_number"];
}
if (($current_bid != $idle_bid)||($idle_lot != $lot_number)) break;
sleep(1);
} else {
$return_array[99] = "closed";
}
if ($existCount == 0 ) break;
}
//other php code here
}
客户端是一个简单的AJAX函数:
function waitForMsg(lot, bid){
$.ajax({
type: "POST",
url: "live_bidding_script.php",
data: { action: "ping", lot: lot, bid: bid},
dataType: "json",
async: true,
cache: false,
timeout:50000,
success: function(data){
//other jquery code here
setTimeout(function(){waitForMsg(lot, bid)}, 1000);
}
},
error: function(XMLHttpRequest, textStatus, errorThrown){
//other jquery code here
setTimeout(function(){waitForMsg(lot, bid)}, 1000);
}
});};
该剧本在测试中运作良好,但当我们进行模拟拍卖时,我们突然崩溃并烧毁。我们害怕了:
SQLSTATE[42000] [1226] User 'XXXX' has exceeded the 'max_user_connections' resource (current value: 20)
我删除了循环,这似乎是问题的主要原因,(即保持连接一次打开15秒,并迅速用完所有20个连接)并恢复为简单轮询。
现在,通过阅读数十篇文章,民意调查甚至长期民意调查都不是“走出去”的方式。可以这么说。所以我即将重新编码该网站。
我的问题是使用websockets的最新技术(即:pub nub,node.js,socket.io甚至是Comet)他们会解决这个问题的max_server_connections&#39;,如果有的话请解释如何/为什么。
我理解新技术的工作方式有所不同,但如果WS协议不可用,它们似乎都有回退方法(通常是轮询),这让我相信如果我们有1000个并发用户,20个以上的旧浏览器,例如,我们仍然会得到相同的&#39; max_server_connections&#39;问题。
PS:我们将在未来几年内使用预付费托管服务器,只需增加“max_user_connections”的数量即可。是不行的。改变主机可能是一种选择,虽然这是一项非常昂贵/耗时的练习。
感谢。