PHP:检测并显示“服务器重载”消息

时间:2012-03-15 09:27:09

标签: php apache optimization lamp

我注意到一些网站,例如hypem.com显示“你没有得到服务”的错误信息,当网站繁忙时,而不是让人们等待,超时或刷新;加剧了可能是服务器负载问题。

  

我们太过负载无法处理您的请求。请点击你的“返回”   浏览器并尝试再次尝试。

在服务器过载之前如何实现?如果一个站点发生过载而同时让站点有时间恢复,这听起来像是一种非常巧妙的方法来管理用户的期望。

6 个答案:

答案 0 :(得分:2)

您可以简单地创建一个500.html文件,并让您的网络服务器在每次引发50x错误时使用该文件。

即。在你的apache配置中:

ErrorDocument 500 /errors/500.html

或使用php shutdown function检查是否已达到请求超时(默认为30秒),如果是,则重定向/呈现静态内容(以便呈现错误本身不会导致问题)。

请注意,您会看到“此网站响应时间过长”消息的大多数网站都会使用javascript有效地生成该消息。

答案 1 :(得分:2)

另一种选择是:

$load = sys_getloadavg();
if ($load[0] > 80) {
    header('HTTP/1.1 503 Too busy, try again later');
    die('Server too busy. Please try again later.');
}

我是从php的网站http://php.net/sys_getloadavg获得的,尽管我不确定sys_getloadavg返回的值是什么意思

答案 2 :(得分:1)

您可以使用php tick函数检测服务器何时未加载指定的时间,然后显示错误消息。基本用法:

<?php 
$connection  = false; 
function checkConnection( $connectionWaitingTime = 3 ) 
{ 
    // check connection & time 
    global $time,$connection; 
    if( ($t = (time() - $time)) >= $connectionWaitingTime && !$connection){  
        echo ("<p> Server not responding  for <strong>$t</strong> seconds !! </p>"); 
        die("Connection aborted");             
    } 
} 

register_tick_function("checkConnection"); 
$time = time(); 
declare (ticks=1) 
{ 
   require 'yourapp.php' // load your main app logic
    $connection = true ; 
}

while(true)只是为了模拟加载的服务器。 要在站点中实现脚本,您需要删除while语句并添加页面逻辑E.G dispatch事件或前端控制器操作等。

checkCOnnection函数中的$ connectionWaitingTime在3秒后设置为超时,但您可以将其更改为您想要的任何内容

答案 3 :(得分:1)

这可能与数据库连接超时有关,但这假设您的服务器在时间变得艰难时具有比CPU负载更大的DB负载。如果是这种情况,如果1秒内没有连接,您可以让数据库连接器显示消息。

您还可以使用对日志表的快速查询来查找有多少点击/秒,并在某个点之后自动不再响应,以便为其他点保留QOS。在这种情况下,您必须根据服务器日志手动设置该级别。在Drupal油门模块中可以看到另一种方法here

另一个替代方案是使用Apache状态页面来获取有关有多少子进程空闲的信息,并根据@ giltotherescue对this question的回答来限制没有剩余的子进程。

答案 4 :(得分:1)

答案 5 :(得分:1)

这不是一个严格的PHP解决方案,但你可以像Twitter一样,即:

  • 从CDN或您的其他服务器提供主要是静态HTML和Javascript 应用
  • 对实际繁重的工作服务器端(在您的情况下为PHP)函数/ API的调用实际上是从一个静态JS文件 中完成的
  • 因此您可以在AJAX通话上设置超时,并返回“似乎加载推文可能需要比预期更长的时间” - 就像通知一样。