【发布时间】:2015-12-01 16:12:03
【问题描述】:
我有一个网站,始终有大约 700 到 1000 名用户在线。最近我体验到我的网站变得非常缓慢。似乎有某种瓶颈。
我当前的设置是我有一个index.php 页面,它处理我的所有子页面。设计是这样的:
include_once($settings['incpath'].'_ify_database.php');
//Define the extra page levels.
$i = (isset($_GET['i']) ? inputFilter($_GET['i']) : 'h');
$xp = (isset($_GET['p']) ? inputFilter($_GET['p']) : null);
$xpp = (isset($_GET['n']) ? inputFilter($_GET['n']) : null);
switch($i){
case 'h': // Home
include($settings['themespath'].$config['active_theme'].'/indexheader.php');
include($settings['pagepath'].'home.php');
include($settings['themespath'].$config['active_theme'].'/indexfooter.php');
break;
}
这就是我连接数据库的方式 (_ify_database.php):
try {
$dsn = "mysql:host=" . $database['host'] . ";dbname=" . $database['db'];
$dbh = new PDO($dsn, $database['user'], $database['pass'], array(PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); // <== add this line
}
catch(PDOException $e){
echo $e->getMessage();
}
如您所见,我已将持久连接设置为false:
PDO::ATTR_PERSISTENT => false
如果我将它启用到TRUE,我会看到加载时间明显增加,但一段时间后我收到Too Many Connections 错误。
我做错了什么?如果网站上有 500 人,速度很快。如果有 900-1000 则加载时间加倍。
【问题讨论】:
-
您应该监控 MySQL 和验证这些连接是否正在实际使用,或者只是空闲。在第一种情况下,可能值得增加限制。
-
@ÁlvaroGonzález 这些访问者中的许多人只是被重定向到我的网站,并且在那里停留了 0 到 2 分钟。如何防止这些连接处于空闲状态?
-
不确定您所说的“被重定向”是什么意思...我没有再次尝试使用最近的 PHP 版本,但过去我遇到过 MySQL 驱动程序无法重用的糟糕经历连接和不必要地打开新连接 -
show processlist查询会将大多数连接显示为“睡眠”。 -
您没有指定如何为 PHP 提供服务 - 通过 Apache 和
mod_php或者您使用的是php-fpm- 这对您的问题至关重要,因为我们可以确定实际有多少连接以及是否SQL是瓶颈。在您 100% 确定要查找的位置之前,不要解决任何问题。另外,所有东西都位于一台物理机器上吗?