当我在本地计算机上的服务器上运行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.7版。
@libreman,我正在创建一个Database Utility类实例,并使用构造函数注入将其注入到许多其他服务类中。
这是一个简化示例,但我的服务类如下所示:
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);");
}
}
答案 0 :(得分:0)
每次mysqliDALUtility对象被破坏时,$ conn变量也被销毁,但请记住,这并不意味着与数据库的连接也是关闭的,在__destruct函数中关闭连接的好习惯我认为你必须实现你可以用任何方式发布单例模式你如何使用mysqliDALUtility对象?
答案 1 :(得分:-1)
尝试删除p:
new mysqli('p:127.0.0.1', 'user', 'pw', 'db');
作为manual says,
通过p:预先添加主机打开持久连接。在从连接池打开的连接上自动调用mysqli_change_user()。
当您阅读mysql_change_user()手册时,
注意:
使用此命令将始终使当前数据库连接的行为就像是一个全新的数据库连接一样,无论操作是否成功完成。此重置包括对任何活动事务执行回滚,关闭所有临时表以及解锁所有锁定表。