我注意到一些网站,例如hypem.com显示“你没有得到服务”的错误信息,当网站繁忙时,而不是让人们等待,超时或刷新;加剧了可能是服务器负载问题。
我们太过负载无法处理您的请求。请点击你的“返回” 浏览器并尝试再次尝试。
在服务器过载之前如何实现?如果一个站点发生过载而同时让站点有时间恢复,这听起来像是一种非常巧妙的方法来管理用户的期望。
答案 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)
您也可以限制apache配置中的最大连接...
参考
http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients
http://www.howtoforge.com/configuring_apache_for_maximum_performance
答案 5 :(得分:1)
这不是一个严格的PHP解决方案,但你可以像Twitter一样,即: