我对PHP/MySQL非常新手,一边学一边做。我最近学到的其中一个新事物是,每个用户名在数据库中能够建立的连接数是有上限的。当我开始用 Wordpress 构建我的网站时,我使用的是旧版的 mysql_query() 命令。因为 Wordpress 只要在网站上登录就会保持活动连接,所以我从未必须创建到 MySQL 数据库的连接。当我决定将所有 MySQL 查询转换为 PDO 扩展时,我不能再利用 Wordpress 的活动连接了,而是必须开始自己的数据库连接。我在一个单独的 PHP 配置文件中完成这个操作,并在运行脚本的每个页面中引入它。PHP 代码如下:
try {
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
catch(PDOException $e) {
echo "Select DB Error: " .$e->getMessage(). "</br>";
}
很不幸,我经常遇到以下错误:
" SQLSTATE[42000] [1203] User already has more than 'max_user_connections' active connections"
通过一些在线研究,我尝试了各种不同的方法来解决这个问题。首先,我尝试在每个脚本结束时将数据库连接设置为null(尽管这应该是 PHP PDO 的默认设置?)。然后我尝试在每次查询数据库之后将每个语句处理程序设置为null
(这是一个绝望的努力)。最后,我尝试使用持久连接,通过更改配置文件中的以下行:
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass, array(PDO::ATTR_PERSISTENT => true));
似乎这一切都不起作用,我仍然得到完全相同的错误。网站在准备好时需要能够处理每天100-200人输入各种不同的数据。即使我能弄清楚如何利用Wordpress的PDO活动连接,那也是一个好的开始。我会感激任何帮助。
更新:
我正在将SHOW FULL PROCESSLIST
作为MySQL查询运行在我的代码中,但我得到非常奇怪的行为。这是我的脚本的第一部分(不包括SHOW FULL PROCESSLIST
查询):
<?php
include 'config.php';
if(isset($_POST['submit']))
{
//Get Current User Login
global $current_user;
$current_user = wp_get_current_user();
$ulog = $current_user->user_login;
$tablename_cc = "cc_".$ulog;
$tablename_db = "db_".$ulog;
$tablename_misc = "misc_".$ulog;
$tablename_cash = "cash_".$ulog;
try {
$DBH->exec("CREATE TABLE IF NOT EXISTS " .$tablename_cc. " (ID bigint(100) NOT NULL AUTO_INCREMENT, PRIMARY KEY(ID), accnt TEXT(20), cc_num TEXT(4), cc_amnt DECIMAL(8,2), cc_app TEXT(20), cc_date VARCHAR(10), cc_time VARCHAR(10))");
$DBH->exec("CREATE TABLE IF NOT EXISTS " .$tablename_db. " (ID bigint(100) NOT NULL AUTO_INCREMENT, PRIMARY KEY(ID), accnt TEXT(20), db_num TEXT(20), db_amnt DECIMAL(8,2), db_date VARCHAR(10), db_time VARCHAR(10))");
$DBH->exec("CREATE TABLE IF NOT EXISTS " .$tablename_misc. " (ID bigint(100) NOT NULL AUTO_INCREMENT, PRIMARY KEY(ID), accnt TEXT(20), misc_item TEXT(1000), misc_amnt DECIMAL(8,2), misc_date VARCHAR(10), misc_time VARCHAR(10))");
$DBH->exec("CREATE TABLE IF NOT EXISTS " .$tablename_cash. " (ID bigint(100) NOT NULL AUTO_INCREMENT, PRIMARY KEY(ID), accnt TEXT(20), cash_amnt DECIMAL(8,2), cash_time VARCHAR(10))");
}
catch(PDOException $e) {
echo "Create Tables Error: " .$e->getMessage();
}
} ?>
如果我尝试在if语句外部运行SHOW PROCESS LIST
查询,则会得到一个结果,指出我有一个活动连接;但是,如果我尝试在if语句内部运行SHOW FULL PROCESSLIST
查询,则会出现超过连接数的错误。基于此结果,我认为也许页面顶部的include
行在用户提交表单时导致问题(实际上是尝试两次连接数据库),所以我将其移至if语句内部,但也没有任何区别。我对这种情况感到困惑。更新/答案(仍有一些问题):
我找到了我的问题所在。在其中一个脚本完成后,有一个javascript命令弹出一个窗口,在那里另一个脚本将为他们打印发票。第二个脚本也尝试使用配置文件连接到数据库。用户使用的表单是动态的(他们可以输入尽可能少或多的数据集),因此当用户插入少量数据时,PDO查询非常快,并且连接数之间没有冲突;但是,如果用户输入大量数据,则需要更长时间,服务器达到最大连接数。问题实际上存在于服务器环境差和我的低效查询的组合中(还在学习PHP)。目前唯一的解决方案是在我的第二个脚本上放置更长的睡眠时间(已经使用了3秒的睡眠时间),以让其他脚本赶上,但是在某个时候,这将需要太长时间。我不确定您们是否有任何更好的建议?