使用PDO修复PHP类中的max_user_连接
我一直在修改一个较旧的抽象层以使用PDO,但我遇到了使用PDO修复PHP类中的max_user_连接,php,mysql,pdo,Php,Mysql,Pdo,我一直在修改一个较旧的抽象层以使用PDO,但我遇到了用户x在大型集合中循环时有超过'max_user_connections'的活动连接SQLSTATE[HY000][1203]错误。我一直在阅读,但我所有试图从循环中取消设置$dbh的尝试都会导致由于结束连接而导致错误 基类看起来像 class DB { public $pdo; private $host = DB_HOST; private $user = DB_USER; private $pass =
用户x在大型集合中循环时有超过'max_user_connections'的活动连接SQLSTATE[HY000][1203]
错误。我一直在阅读,但我所有试图从循环中取消设置$dbh的尝试都会导致由于结束连接而导致错误
基类看起来像
class DB {
public $pdo;
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;
public function __construct()
{
$this->connect();
}
private function connect()
{
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try {
$this->pdo = new PDO("mysql:host=$this->host;dbname=$this->dbname;charset=utf8;", $this->user, $this->pass, $options);
} catch(PDOException $e) {
echo $e->getMessage();
}
}
public function __sleep()
{
return array('dsn', 'username', 'password');
}
public function __wakeup()
{
$this->connect();
}
public function __destruct()
{
$this->connection = null;
$this->pdo = null;
unset($this->pdo);
}
// CRUD methods follow including
function retrieve($where, $groupBy='', $order_by='') {
$query = "SELECT * FROM `$this->table` $where $groupBy $order_by";
$q = $this->pdo->prepare($query);
$q->execute();
$result = $q->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,get_class($this));
// was $result = $q->fetchAll(PDO::FETCH_CLASS,get_class($this));
$this->query_log($query);
$q = null;
if ($result == 'NULL') {
return false;
} else {
return $result;
}
} // retrieve()
有错误的例子是
if (in_array($_GET['type'], $types)) {
$type = $_GET['type'];
$rsObj = new ReservedSlug;
if ($type == 'artist') {
$obj = new CalendarArtist;
$slugfield = 'urlSlug';
$namefield = 'name';
} else if ($type == 'event') {
$obj = new CalendarEvent;
$slugfield = 'urlSlug';
$namefield = 'name';
} else if ($type == 'location') {
$obj = new Location;
$slugfield = 'UrlSlug';
$namefield = 'LocationName1';
}
$needslug = $obj->retrieve("TRIM(`$namefield`) != '' AND (`$slugfield` = '' OR `$slugfield` IS NULL) LIMIT 0,400");
if ($needslug) {
foreach ($needslug as $ns) {
$testslug = slugify($ns->$namefield);
list($reserved) = $rsObj->retrieve("`slug` = '$testslug' AND `type` = '$type'");
if (!$reserved) {
list($test) = $obj->retrieve("`$slugfield` = '$testslug'");
if ($test) {
for ($i = 2; $i < 26; $i++) {
list($test) = $obj->retrieve("`$slugfield` = '$testslug-$i'");
if (!$test) {
$slug = $testslug . '-' . $i;
}
}
} else { // not found in table
$slug = $testslug;
}
} else { // was reserved
$slug = false;
}
echo $ns->$namefield . " gets $slug<p>";
} // foreach needslug
} // if needslug
} // type found in array
if(在数组中($\u GET['type'],$types)){
$type=$_GET['type'];
$rsObj=新的储备量;
如果($type=='artist'){
$obj=新日历艺术家;
$slugfield='urlslaug';
$namefield='name';
}else if($type=='event'){
$obj=新日历事件;
$slugfield='urlslaug';
$namefield='name';
}else if($type=='location'){
$obj=新位置;
$slugfield='urlslaug';
$namefield='LocationName1';
}
$needslug=$obj->retrieve(“修剪(`namefield`)!=''和(`$slugfield`=''或`slugfield`为空)限制0400”);
如果($needslug){
foreach($needslug作为$ns){
$testslug=slagify($ns->$namefield);
列表($reserved)=$rsObj->retrieve(`slug`='$testslug'和`type`='$type');
如果(!$预订){
列表($test)=$obj->retrieve(“$slugfield`='$testslug');
如果($测试){
对于($i=2;$i<26;$i++){
列表($test)=$obj->retrieve(“`$slugfield`='$testslug-$i');
如果(!$test){
$slug=$testslug.'-'.$i;
}
}
}在表中找不到else{//
$slug=$testslug;
}
}否则{//将被保留
$slug=false;
}
echo$ns->$namefield.“获取$slug”;
}//foreach needslug
}//如果需要slug
}//在数组中找到类型
因此,我需要了解如何在活动连接可用时不创建新连接,以及如何正确地_destruct()这些子对象。我哪里出错了?使用持久连接<代码>$options=array(PDO::ATTR_PERSISTENT=>true,…)代码>不要从DB扩展应用程序类。slug不是数据库。@CharlotteDunois JFYI它会更快地杀死他的服务器。使用持久连接来固化max connections就像用gasoline@YourCommonSense我正在扩展DB,这样每个类都可以访问常见的CRUD函数。子类如何在没有连接的情况下执行CRUD,或者如何在没有继承的情况下执行连接?我同意其他人的观点,即使用持久连接并继承DB类“不是最佳的”。但是,它目前适用于您。为什么?我认为这完全是因为你使用了“积垢”。每个对象执行一个小的db任务,然后释放连接,这允许其他对象立即重用连接。它的效率不如仅仅重用它,但比尝试创建许多以前发生的新连接要好得多。最终结果imo,-对于非常短的查询环境,使用持久连接是可以的。我认为一个连接就足够了,但它是有效的。使用持久连接<代码>$options=array(PDO::ATTR_PERSISTENT=>true,…)代码>不要从DB扩展应用程序类。slug不是数据库。@CharlotteDunois JFYI它会更快地杀死他的服务器。使用持久连接来固化max connections就像用gasoline@YourCommonSense我正在扩展DB,这样每个类都可以访问常见的CRUD函数。子类如何在没有连接的情况下执行CRUD,或者如何在没有继承的情况下执行连接?我同意其他人的观点,即使用持久连接并继承DB类“不是最佳的”。但是,它目前适用于您。为什么?我认为这完全是因为你使用了“积垢”。每个对象执行一个小的db任务,然后释放连接,这允许其他对象立即重用连接。它的效率不如仅仅重用它,但比尝试创建许多以前发生的新连接要好得多。最终结果imo,-对于非常短的查询环境,使用持久连接是可以的。我认为一个连接就足够了,但它是有效的。