use*_*781 10 php mysql pdo database-connection database-management
我是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>";
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我经常遇到以下错误:
"SQLSTATE [42000] [1203]用户已超过'max_user_connections'活动连接"
基于一些在线研究,我尝试了各种不同的方法来解决这个问题.首先,我尝试在每个脚本的末尾将数据库连接设置为null(尽管这应该是PHP PDO的默认值?).然后我尝试null在数据库的每次查询之后设置每个语句句柄(这是一个毫无希望的努力).最后,我尝试通过更改配置文件中的以下行来使用持久连接:
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass, array(PDO::ATTR_PERSISTENT => true));
Run Code Online (Sandbox Code Playgroud)
这似乎都不起作用,我仍然得到同样的错误.该网站准备好后,每天需要能够处理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();
}
} ?>
Run Code Online (Sandbox Code Playgroud)
如果我尝试SHOW PROCESS LIST在if语句之外运行查询,我会得到一个结果,表明我有一个活动连接; 但是,如果我尝试运行SHOW FULL PROCESSLIST查询内部 if语句的,我感到我已经超过了我的连接数的错误.基于这个结果,我想可能include在页面顶部的行可能会导致用户提交表单时出现问题(本质上是尝试连接数据库两次),所以我将它移到了if语句中,但是没有任何区别.我不知道为什么会发生这种情况.
更新/答案(仍有一些问题):
我弄清楚我的问题是什么.完成我的一个脚本后,有一个javascript命令可以弹出一个窗口,其中另一个脚本会为它们打印出发票.第二个脚本还尝试使用配置文件建立与数据库的连接.用户使用的表单是动态的(他们可以根据需要输入尽可能少的数据集),因此当用户插入少量数据时,PDO查询执行速度非常快,并且之间没有冲突连接数量; 但是,如果用户输入大量数据,则需要花费更多的时间,并且服务器会达到最大连接数.这个问题确实存在于糟糕的服务器环境和低效查询的组合中(仍在学习PHP).我现在能想到的唯一解决方案是在我的第二个脚本(已经使用3秒睡眠)上进行更长时间的睡眠,让其他脚本赶上,但在某些时候,这将花费太长时间.我不确定你们有没有更好的建议?
如果您有其他工具可以为您提供与数据库的连接,您可能想查看实际建立了多少个连接。紧要关头,phpmyadmin可以做到这一点。
通常您可以通过以下方式查看所有活动查询和连接:
SHOW PROCESSLIST
Run Code Online (Sandbox Code Playgroud)
如果您在 PDO 连接例程中犯了一个错误,您可能会为您尝试运行的每个查询建立连接,而不是在请求期间建立连接。您可能还需要检查每个请求是否没有为您创建大量未正确关闭的连接。您可能需要尝试连接选项。