使用polling / comet / websockets克服'max_user_connections'问题

时间:2015-02-03 07:23:44

标签: javascript php mysql ajax websocket

我有一个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”的数量即可。是不行的。改变主机可能是一种选择,虽然这是一项非常昂贵/耗时的练习。

感谢。

0 个答案:

没有答案