PHP';s mysqli在查询后关闭连接

PHP';s mysqli在查询后关闭连接,php,mysqli,Php,Mysqli,当我在本地机器上的服务器上运行PHP时,每当我执行mysqli->query()时,数据库连接就会关闭。我有一个解决这个问题的方法,但是谁能告诉我为什么会发生这种情况,以及是否有一个方法来防止它 以下是相关的PHP代码片段、输出日志和PHP.ini配置值,以供参考 class mysqliDALUtility { private $conn; function __construct() { self::OpenNewConnection(); }

当我在本地机器上的服务器上运行PHP时,每当我执行mysqli->query()时,数据库连接就会关闭。我有一个解决这个问题的方法,但是谁能告诉我为什么会发生这种情况,以及是否有一个方法来防止它

以下是相关的PHP代码片段、输出日志和PHP.ini配置值,以供参考

class mysqliDALUtility {
    private $conn;

    function __construct() {
        self::OpenNewConnection();
    }

    public function PerformQuery($queryString) {
        ...
        $result = self::QueryDB($queryString);
        ...
    }

    private function IsConnectionClosed() {
        return !$this->conn->stat();
    }

    private function OpenNewConnection() {
        $this->conn = new mysqli('p:127.0.0.1', 'user', 'pw', 'db');
    }

    private function QueryDB($queryString) {
        if (self::IsConnectionClosed()) {
            self::OpenNewConnection();
        }

        return $this->conn->query($queryString);
    }
}
当我添加日志并在一行中执行两个查询时,我发现事件的顺序是

  • 调用构造函数并创建新连接

  • 对于查询#1,使用现有连接

  • 查询完成后,连接关闭

  • 对于查询#2,创建一个新连接

  • 查询完成后,连接关闭

  • 我的php.ini日志包含

    extension=php_mysqli.dll
    ...
    
    [MySQLi]
    
    mysqli.max_persistent = -1
    ;mysqli.allow_local_infile = On
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.cache_size = 2000
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    

    另外,我使用的是PHP版本5.6.11


    @libreman,我正在创建一个数据库实用程序类实例,并使用构造函数注入将其注入到许多其他服务类中

    这是一个简化的示例,但我的服务类如下所示:

    function __construct(mysqlDALUtility $dbUtility) {
       $this->db = $dbUtility;
    }
    
    public function serviceClassFunction() {
        $accessLevel = $this->db->PerformQuery("CALL usp_get_member_access_level('**********')");
        if ($accessLevel > 0) {
            $this->db->PerformQuery("CALL usp_get_dialogue_details(18,true);");
        }
    }
    

    尝试删除
    newmysqli中的
    p:
    ('p:127.0.0.1','user','pw','db')

    作为,

    通过p预先结束主机:打开一个持久连接。在从连接池打开的连接上自动调用mysqli_change_user()

    当你阅读手册的时候,上面写着

    注:

    无论操作是否成功完成,使用此命令将始终使当前数据库连接的行为与全新数据库连接的行为相同。此重置包括对任何活动事务执行回滚、关闭所有临时表以及解锁所有锁定的表


    每次mysqliduality对象被销毁时,$conn变量也会被销毁,但请记住,这并不意味着与数据库的连接也会被关闭,在uu析构函数中关闭连接是一种好的做法吗?我认为您必须以任何方式实现singleton模式。您可以发布您是如何使用MySQLIDutility对象的吗?

    “在u析构函数中关闭连接是一种好的做法吗?”---是吗?当然,或者你可以得到:连接太多的错误当然,最理想的是重复使用同一个连接,这样你就不会节省网络资源、内存和时间打开/关闭新连接php会在返回之前自动关闭所有连接吗?因此,手动操作实际上不会改变任何东西。当然,也可能会出现“连接太多错误”。无论如何,最理想的方法是重复使用同一个连接,这样可以节省网络资源、内存和时间,因为您不会在每次执行php脚本时打开/关闭新连接。“连接太多错误”与此无关,因为php会自动关闭连接。所以无论你是否关闭它都没有区别。当我从ip地址中删除“p:”时,我会得到相同的行为。但是我想我想保持连接。为什么你提到“mysql\u change\u user()”注释?它确实产生了我所看到的结果,但我不会在任何地方调用它。如果你阅读手册页面,它会被API自动调用为提示!我已经删除了“p:”,但仍然得到相同的结果。有什么想法吗?