Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当服务器的使用超过限制时,将用户重定向到静态页面_Php_Mysql - Fatal编程技术网

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

Php 当服务器的使用超过限制时,将用户重定向到静态页面,php,mysql,Php,Mysql,我们希望实现一种方法,用于检查服务器和服务器上的mysql负载或总会话数 如果此数字大于某个值,则网站的下一个访问者将被重定向到一个静态网页,其中包含一条消息,有太多用户稍后尝试此消息。看似最简单的答案是计算ini_getsession.save_路径中的会话文件数,但从web应用程序访问该目录存在安全问题 第二种方法是使用一个数据库,该数据库以原子方式统计打开会话的数量。对于性能确实不是问题的少量会话,但您希望特别准确地了解开放会话的数量,这将是一个不错的选择 我建议的第三个选项是设置一个计时

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

看似最简单的答案是计算ini_getsession.save_路径中的会话文件数,但从web应用程序访问该目录存在安全问题

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

我建议的第三个选项是设置一个计时作业,计算ini_get'session.save_path'目录中的文件数,然后仅在文件系统上某个公共区域的文件发生更改时才将该数字打印到该文件中,该文件对web应用程序可见。可以将此作业配置为按您希望的频率运行—如果您希望获得更好的分辨率,可以说是每秒运行一次。您的引导加载程序将打开此文件进行读取,检查数字,如果高于X,则给出静态页面


当然,第三种方法不会造成硬限制。但是,如果您只是在寻找一个通用阈值,这似乎是一个不错的选择。

看似最简单的答案是计算ini\u getsession.save\u路径中的会话文件数,但从web应用程序访问该目录是一个安全问题

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

我建议的第三个选项是设置一个计时作业,计算ini_get'session.save_path'目录中的文件数,然后仅在文件系统上某个公共区域的文件发生更改时才将该数字打印到该文件中,该文件对web应用程序可见。可以将此作业配置为按您希望的频率运行—如果您希望获得更好的分辨率,可以说是每秒运行一次。您的引导加载程序将打开此文件进行读取,检查数字,如果高于X,则给出静态页面


当然,第三种方法不会造成硬限制。但是,如果你只是在寻找一个通用的阈值,这似乎是一个不错的选择。

我在我的网站上实现它的一种方法是在MySQL拒绝连接时处理错误消息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);
}

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

我在我的网站上实现它的一种方法是处理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);
}

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

以下是我过去为减少负载而使用的一些用户锁定替代方案:

APC缓存 PHP APC缓存通过脚本的内存缓存加速对脚本的访问:

我不认为这会为你解决太多的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 
}
你还谈到有太多的会议。很难说您指的是$\u会话会话,还是仅仅浏览用户,但太多的$\u会话可能表示您需要放弃使用$\u会话作为存储设备,太多的浏览用户再次表示您可能希望有选择地发送高使用率页面的缓存头。例如,几乎我所有的php脚本都返回默认的缓存,除了我的主页,它没有缓存。我的主页显示标题,允许浏览器在短时间内缓存1小时,以减少总体负载


总的来说,除了设置一个严格的使用限制(理想情况下永远不会达到这个限制),我肯定会研究一下您的缓存过程。这里有一些替代用户锁定的方法,我过去曾使用过这些方法来减少负载:

APC缓存 PHP APC缓存通过脚本的内存缓存加速对脚本的访问:

我不认为这会为你解决太多的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 
}
你还谈到有太多的会议。很难说您指的是$\u会话会话,还是仅仅浏览用户,但太多的$\u会话可能表示您需要放弃使用$\u会话作为存储设备,太多的浏览用户再次表示您可能希望有选择地发送高使用率页面的缓存头。例如,几乎我所有的php脚本都返回默认的缓存,除了我的主页,它没有缓存。我的主页显示标题,允许浏览器在短时间内缓存1小时,以减少总体负载


总的来说,除了设置一个严格的使用限制外,我肯定会研究一下您的缓存过程,这在理想情况下是永远不会达到的。

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

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

proxy_intercept_errors on;
error_page 503 /503.html;
location = /503.html {
    root /var/www;
}
这听起来并不难


PHP不是适合这项工作的工具,因为一旦你真的达到了极限,你就注定要失败。

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

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

proxy_intercept_errors on;
error_page 503 /503.html;
location = /503.html {
    root /var/www;
}
这听起来并不难


PHP不是适合这项工作的工具,因为一旦你真的达到了严格的限制,你就注定要失败。

这种方法的问题在于它计算所有会话的数量。但我们可能在5分钟内有1000000名用户访问我们的网站,但在接下来的10分钟内,我们的用户将为零。如果我们计算10分钟内的会话数,我们将计算100000个打开的会话,但它们存在只是因为会话超时为20分钟。因此,我更愿意检查mysql的使用情况或服务器的使用情况,并根据该值重定向下一个用户。但我们可能在5分钟内有1000000名用户访问我们的网站,但在接下来的10分钟内,我们的用户将为零。如果我们计算10分钟内的会话数,我们将计算100000个打开的会话,但它们存在只是因为会话超时为20分钟。因此,我更愿意以某种方式检查mysql的使用情况或服务器的使用情况,并根据该值重定向下一个用户。您的数据库服务器中是否安装了任何服务器运行状况监视工具?听起来您可能只需要更好的缓存…?是的,可能它需要更好的缓存,但它是一个实时网站,我们无法进行重大更改目前正在编写代码。如果我们向用户显示一条消息,请稍后再试,这是可以接受的。也许我们可以这样做,我们可以显示mysql的状态并检查变量的值吗?你能对mysql的状态变量提出建议吗?是的,您提出的解决方案对用户非常不友好。您的数据库服务器中是否安装了任何服务器运行状况监视工具?听起来您可能需要更好的缓存…?是的,可能它需要更好的缓存,但它是一个实时网站,我们目前无法对代码进行重大更改。如果我们向用户显示一条消息,请稍后再试,这是可以接受的。也许我们可以这样做,我们可以显示mysql的状态并检查变量的值吗?你能对mysql的状态变量提出建议吗?是的,你提出的解决方案对用户非常不友好。