Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关闭PDO连接问题_Php_Mysql_Database_Pdo - Fatal编程技术网

Php 关闭PDO连接问题

Php 关闭PDO连接问题,php,mysql,database,pdo,Php,Mysql,Database,Pdo,我的PDO连接有问题! 我读到我不想关闭PDO连接,因为它将自动关闭! 但若你们想手动关闭它,我需要给连接变量赋值Null。 但是我使用了一个数据库类,数据库查询是这样运行的 $addUser = users::getInstance()->userAdd($data); 和用户类包含以下内容 class users extends DB { private static $_instance = null; public static function getInstance()

我的PDO连接有问题! 我读到我不想关闭PDO连接,因为它将自动关闭! 但若你们想手动关闭它,我需要给连接变量赋值Null。 但是我使用了一个数据库类,数据库查询是这样运行的

$addUser = users::getInstance()->userAdd($data);
和用户类包含以下内容

class users extends DB {
private static $_instance = null;   
public static function getInstance(){

if (!isset(self::$_instance)){
    self::$_instance = new users();
}
return self::$_instance;
} 
 [...]
 }
和数据库类

    class DB {

    private static $_instance = null;
    private $_con;
        [...]

    public function __construct(){
        try{
    $this->_con = new PDO('mysql:host=localhost';dbname=db,user,pass);  
        }catch(PDOException $e){
            die ($e->getMessage());
        }
    } 

public function __destruct (){
    $this->close();
}

public static function getInstance(){
    if (!isset(self::$_instance)){
        self::$_instance = new DB();
    }
    return self::$_instance;
}

public function close(){
    $this->_con = null;
}
[...] }
问题是脚本没有关闭连接,因为当我限制本地主机中的最大用户连接数或使用已经限制它的免费webhost服务时,我会收到此错误消息

SQLSTATE[HY000] [1203] User 'userName' already has more than 'max_user_connections' active connections

我需要一个解决方案,通过在使用实例方法建立连接时关闭连接来避免此错误消息

我把这篇文章留在这里,提醒我在发布“不太有用”的答案之前先考虑一下-/

请使用“您的常识”提供的答案与全局重复使用连接

不要再读了

停止丢弃未使用的连接!让他们保持活跃

完成“连接”后,将其返回到“空闲列表”数组。不要破坏它

1) 当需要新的数据库连接时,请检查“空闲列表”。如果有的话,抓取最上面的免费的

2) 如果没有免费的,创建一个并使用它

3) 完成后将其放入免费列表。不要关上它

将“空闲列表”实现为“堆栈”。我还保存了一份“活动连接列表”。完成后,只需将其返回到“自由列表”

这很有效

您可能用完了“数据库句柄”,但需要十个活动事务

  • 摆脱DB类
  • 不要从DB类扩展应用程序类
  • 不要玩静态魔法
  • 创建原始PDO对象并在应用程序类中传递它
  • 忘掉这些联系吧
  • 事情是这样的:

    $pdo  = new PDO('mysql:host=localhost;dbname=db','user','pass');    
    $user = new users($pdo);
    $user->select();
    
    class users
    {
        protected $db;
    
        function __construct($pdo){
            $this->db = $pdo;
        }
        function select()
        {
            $this->db->query("select 1");
        }
    }
    

    这样,每个脚本实例只会创建一个连接,您将永远不会再遇到这样的错误。

    中没有“自由列表”这样的东西PHP@Your根据常识,好吧,我同意,我应该将它显式地编码为一个类,负责处理与所需数组的打开连接。我很懒。看,你把PHP看得根本不对。没有,也不应该有任何类似于连接列表的东西,无论是“自由列表”还是“必需数组”。PHP脚本运行一个cli程序-层叠、运行和消亡。没有环境可以为它保存连接池—无论是内部还是外部。每个PHP实例只能打开一个全新的连接,直接连接到DB,没有任何列表。PHP脚本实例本身也不应该拥有一个连接池。它的执行是线性的,所以只有一个连接是没有用的。出于性能考虑,对于上下文无关的挑剔者,应该始终只有一个connectiondisclaimer:我很清楚持久连接和具有不同凭据的多个连接——可能比您更清楚。这里不是这样。如果我想将
    $pdo
    传递给特定类的构造函数并在那里共享,而不使用
    global
    ,那么如何使用它呢?当使用DI容器时,它返回一个错误。只需将$pdo传递给构造函数并将其分配给一个本地变量即可。将$pdo传递给构造函数并将其分配给局部变量是一个DI。为什么它不起作用?这就是我一直在问自己的。我得到了奇怪的警告
    警告:数据库缺少参数2::\uu construct()
    然后是
    注意:未定义变量:pdo in
    。如果我也这样做,但在构造函数中使用
    global$pdo
    ,那么它就可以工作了。为什么会发生这种情况?顺便说一下,我正在使用Dice DIC(),只是为了减少混淆:DIC不是DI。是的,您必须为DIC设置规则