php – 在PDO中的MySQL数据库连接管理

我对 PHP / MysqL很新,我正在学习的东西.我学到的一个新东西是,给定用户名数据库可以连接的最大数量.当我第一次开始在wordpress上建立我的网站时,我正在使用旧的MysqL_query()命令.我从来没有连接到MysqL数据库,因为wordpress保持活跃的连接只是通过登录在网站上.当我决定将所有的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]用户已经有超过’max_user_connections’活动连接”

基于一些在线研究,我尝试了各种不同的方法解决这个问题.首先,我尝试在每个脚本的末尾将数据库连接设置为null(尽管这应该是PHP PDO的认值).然后在数据库的每个查询之后,我尝试将每个语句句柄设置为null(这是一个无望的努力).最后,我尝试使用永久连接,通过更改我的配置文件中的以下行:

$DBH = new PDO("MysqL:host=$host;dbname=$dbname",$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,db_num TEXT(20),db_amnt DECIMAL(8,db_date VARCHAR(10),db_time VARCHAR(10))");        
    $DBH->exec("CREATE TABLE IF NOT EXISTS " .$tablename_misc. " (ID bigint(100) NOT NULL AUTO_INCREMENT,misc_item TEXT(1000),misc_amnt DECIMAL(8,misc_date VARCHAR(10),misc_time VARCHAR(10))");       
    $DBH->exec("CREATE TABLE IF NOT EXISTS " .$tablename_cash. " (ID bigint(100) NOT NULL AUTO_INCREMENT,cash_amnt DECIMAL(8,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秒钟的睡眠)上睡眠较长,让另一个脚本赶上,但在某些时候,这只会花费太长时间.我不知道你们有什么更好的建议吗?

如果您有其他工具可以提供与数据库的连接,您可能需要查看实际生成的连接数量.在一个捏,PHPmyadmin可以做到这一点.

通常您可以看到所有活动的查询和连接:

SHOW PROCESSLIST

如果您在PDO连接例程中发生错误,则可能会在要求运行的每个查询中建立连接,而不是在请求期间进行连接.您可能还需要检查每个请求是否没有为您正确关闭的大型连接池创建.您可能需要尝试连接选项.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...