我需要尝试了解MySQL进程/连接的工作原理。我用google搜索,并没有看到任何外行人的话,所以我在这里问。情况就是这样。
我们的主持人让我们为太多的MySQL进程感到悲伤"。我们在共享服务器上。我们被允许.2的服务器mySQL进程 - 他们声称是50个连接 - 他们说我们正在使用.56。
来自技术支持代表:
" MySQL进程数(平均值) - 0.59意味着您正在使用 共享服务器上可用的MySQL连接总数的0.59%。可接受的值是0.20,这是50个连接。 "
以下是我们正在运行的内容:
Zen Cart: 1.5.1 35K products. Auto updating of 1-20
products every 10 hours via cron.
PHP version 5.3.16
MySQL version 5.1.62-cll
Architecture i686
Operating system linux
我们通常每天在网站上点击大约5000次,即使我在Google网站管理员工具中将抓取率设置为最低,Google bot仍然喜欢访问。
我希望有人可以根据主持人所说的内容向我解释MySQL进程。每当我问他们时,我都会得到一个模糊不清的模糊答案。每次访问者访问网站时是否创建了新的MySQL流程?这似乎不对。
根据技术,我们在那个特定时间使用了150个连接。
编辑: 这是zencart中的连接函数
function connect($zf_host, $zf_user, $zf_password, $zf_database, $zf_pconnect = 'false', $zp_real = false) {
$this->database = $zf_database;
$this->user = $zf_user;
$this->host = $zf_host;
$this->password = $zf_password;
$this->pConnect = $zf_pconnect;
$this->real = $zp_real;
if (!function_exists('mysql_connect')) die ('Call to undefined function: mysql_connect(). Please install the MySQL Connector for PHP');
$connectionRetry = 10;
while (!isset($this->link) || ($this->link == FALSE && $connectionRetry !=0) )
{
$this->link = @mysql_connect($zf_host, $zf_user, $zf_password, true);
$connectionRetry--;
}
if ($this->link) {
if (@mysql_select_db($zf_database, $this->link)) {
if (defined('DB_CHARSET') && version_compare(@mysql_get_server_info(), '4.1.0', '>=')) {
@mysql_query("SET NAMES '" . DB_CHARSET . "'", $this->link);
if (function_exists('mysql_set_charset')) {
@mysql_set_charset(DB_CHARSET, $this->link);
} else {
@mysql_query("SET CHARACTER SET '" . DB_CHARSET . "'", $this->link);
}
}
$this->db_connected = true;
if (getenv('TZ') && !defined('DISABLE_MYSQL_TZ_SET')) @mysql_query("SET time_zone = '" . substr_replace(date("O"),":",-2,0) . "'", $this->link);
return true;
} else {
$this->set_error(mysql_errno(),mysql_error(), $zp_real);
return false;
}
} else {
$this->set_error(mysql_errno(),mysql_error(), $zp_real);
return false;
}
答案 0 :(得分:1)
我想知道连接池是否存在问题。尝试更改此行:
$this->link = @mysql_connect($zf_host, $zf_user, $zf_password, true);
到此:
$this->link = @mysql_connect($zf_host, $zf_user, $zf_password);
manual is useful here - 默认情况下,第四个参数为false,但是您的代码强制它为true,即使现有连接已经打开,也会创建一个新连接(这称为连接池) 并且不必要地保存创建新连接,即节省时间和内存。
我会提出一个警告:在第三方系统中修改核心代码总是需要仔细完成。 可能是他们选择的行为的原因,尽管评论的方式并不多。可能值得通过他们的支持渠道提出一个问题,看看它为什么会这样运作,以及他们是否可以考虑改变它。