2

我正在学习 php/mysql。对于某些问题,我似乎没有找到明确的答案。您能否澄清其中的一些问题或将我指向可靠的来源。谢谢。

(1) 如果我不再需要数据库对象,取消设置对象是否会释放所有相关资源(连接/内存保存结果等),或者我是否必须调用$mysqliResult->free()和/或$mysqliObj->close()在调用unset($mysqliObj).

(2) 另外,如果我使用数据库抽象层,其中抽象类的成员持有 mysqli 对象,是否取消$dbAbstractionObj为其他脚本调用释放 mysql 连接,或者我必须$this->mysqli->close()在数据库抽象类的析构函数中调用.. .我知道PHP会在脚本执行结束时清理所有内容,但我想知道在脚本运行时执行这些操作是否有好处,其中大量数据被获取和处理......我的例子想说:

(1)

$mysqli = new Mysqli($host, $user, $pass, $database);
$result = $mysqli->query('...');
$data = $result->fetch_all(MYSQLI_ASSOC);

/* Now if i don't need $mysqli any futher but would be doing
other stuff on $data that might take a while, do I just */
unset($mysqli)

/* OR */
$result->free();
$mysqli->kill($mysqli->thread_id);
$mysqli->close();
unset($mysqli);

?>

(2)

<?php

class Database {
    private $mysqli;

    public function __construct(array $config) {
        if (!$this->mysqli = new mysqli($config['host'], $config['user'], $config['pass'], $config['database'])) {
            throw new Exception("Couldn't connect to database");
        }
    }

    /* do i need a destructor to close the connection when i unset the
    Database object... like */
    public function __destruct() {
        $this->mysqli->kill($this->mysqli->thread_id);
        $this->mysqli->close();
    }

    /* other methods for select, update, insert, delete */
}
?>
4

1 回答 1

0

使用 mysqli 时,您一次可能只有一个准备好的语句/执行。如果您尝试打开并执行两个准备好的语句而不关闭,您将产生错误。您通过数据库抽象器明确打开的任何资源都应在执行期间由您处理。也就是说,如果您使用抽象器中的信息打开连接,最好显式关闭它(但不要取消设置基本资源本身),从而释放与其关联的资源。拥有一个基本的 mysql 连接不是很消耗资源,但是保持大量与 mysql 服务器的未关闭连接可能会导致它停止接受连接(取决于配置)。大多数执行完成后,如果您在运行时没有明确释放相关的 mysql 资源,它们将自动释放它们。

告诉我这是否有帮助,

于 2013-11-09T20:16:31.980 回答