当服务器的使用超过限制时,将用户重定向到静态页面

时间:2011-09-08 14:19:53

标签: php mysql

我们想实现一个检查服务器上的mysql加载或总会话的方法 如果此数字大于某个值,则该网站的下一个访问者将被重定向到带有消息的静态网页。太多用户稍后会尝试。

4 个答案:

答案 0 :(得分:0)

我在我的网站上实现它的一种方法是在拒绝连接时处理MySQL输出的错误消息。

示例PHP代码:

function updateDefaultMessage($userid, $default_message, $dttimestamp, $db) {
    $queryClients = "UPDATE users SET user_default_message = '$default_message', user_dtmodified = '$dttimestamp' WHERE user_id = $userid";
    $resultClients = mysql_query($queryClients, $db);
    if (!$resultClients) {
        log_error("[MySQL] code:" . mysql_errno($db) . " | msg:" . mysql_error($db) . " | query:" . $queryClients , E_USER_WARNING);
        $result = false;
    } else {
        $result = true;
    }
}

在JS中:

function UpdateExistingMsg(JSONstring)
{
    var MessageParam = "msgjsonupd=" + JSON.encode(JSONstring);
    var myRequest = new Request({url:urlUpdateCodes, onSuccess: function(result) {if (!result) window.open(foo);} , onFailure: function(result) {bar}}).post(MessageParam);
}

我希望上面的代码有意义。祝你好运!

答案 1 :(得分:0)

以下是我过去用来减少负载的用户锁定的一些替代方法:

APC缓存

PHP APC缓存(通过内存缓存脚本加快对脚本的访问):http://www.google.com/search?gcx=c&ix=c2&sourceid=chrome&ie=UTF-8&q=php+apc+cache

我不认为“为你解决”太多的mysql连接,但它确实应该真正帮助你的网站的速度,这将有助于mysql线程更快地打开和关闭,释放资源。这是一个非常简单的安装在debian系统上,并希望任何包管理(如果你使用的是共享服务器,可能会更难)。


缓存常见mysql查询的结果,即使只在同一个脚本执行中。如果您知道要在多个位置调用某些数据(例如,client_info()是我做的很多),请通过静态缓存变量和info参数缓存它(例如

static $client_info;
static $client_id;
if($incoming_client_id == $client_id){
return $client_info;
} else {
 // do stuff to get new client info 
}

你还谈到过多会话。很难说你是在引用$ _SESSION会话,还是只是浏览用户,但是太多$ _SESSION会话可能表明你需要放弃使用$ _SESSION作为存储设备,以及太多的浏览用户同样,暗示您可能希望有选择地为高使用率页面发送缓存标头。例如,我的几乎所有php脚本都返回默认缓存,即no cache,除了我的主页,它显示标题以允许浏览器缓存1小时,以减少总体负载。

总的来说,除了设置一个理想情况下永远不会被命中的使用限制之外,我一定会查看你的缓存程序。

答案 2 :(得分:0)

这不应该在PHP中完成。你应该通过现有的硬限制自然地做到这一点。

例如,如果将Apache配置为已知最大数量的客户端(MaxClients),一旦达到限制,它将回复错误代码503,反过来,您可以捕获在nginx前端并显示静态网页:

proxy_intercept_errors on;
error_page 503 /503.html;
location = /503.html {
    root /var/www;
}

这听起来并不难。

PHP不适合这里的工作,因为一旦你真的达到了硬限制,你将注定失败。

答案 3 :(得分:-1)

看似最简单的答案是计算ini_get("session.save_path")中的会话文件数,但是从Web应用程序访问该目录是一个安全问题。

第二种方法是拥有一个以原子方式计算打开会话数的数据库。对于性能确实不是问题的少数会话,但是您希望对开放会话的数量特别准确,这将是一个不错的选择。

我建议的第三个选项是设置一个chron作业,该作业计算ini_get('session.save_path')目录中的文件数,然后将该数字打印到文件系统上某些公共区域的文件中(只有它已经改变了),对Web应用程序可见。此作业可以配置为按照您的需要频繁运行 - 如果您想要更好的分辨率,请说每秒一次。您的引导加载程序将打开此文件进行读取,检查数字,并在静态页面高于X时给出。

当然,第三种方法不会产生硬性限制。但如果您只是寻找一般阈值,这似乎是一个不错的选择。