我们想实现一个检查服务器上的mysql加载或总会话的方法 如果此数字大于某个值,则该网站的下一个访问者将被重定向到带有消息的静态网页。太多用户稍后会尝试。
答案 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)
以下是我过去用来减少负载的用户锁定的一些替代方法:
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时给出。
当然,第三种方法不会产生硬性限制。但如果您只是寻找一般阈值,这似乎是一个不错的选择。