0

我认为对于大多数 PHP 人来说,这将是一个相当基本的问题。假设我有这个文件可以使用数据库:

<?php
    define("DB_HOST", "localhost");
    define("DB_NAME", "dbname");
    define("DB_USER", "admin");
    define("DB_PASSWORD", "abcdefg");

    $connection;
    $result;

    function connectDatabase() {
        global $connection;

        if(isset($connection)) return;

        $connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
        if(mysqli_connect_errno()) {
            die("Database connection failed: " . mysqli_connect_error() . " (" . mysqli_connect_errno() . ")");
        }

    }

    function queryDatabase($query) {
        global $connection, $result;
        $result = mysqli_query($connection, $query);
        if(!$result) {
            die("Database query failed");
        }
        else {
            return $result;
        }
    }

    function releaseResult() {
        global $result;
        mysqli_free_result($result);
    }

    function closeConnection() {
        global $connection;
        mysqli_close($connection);
    }
?>

假设我这样称呼它:

<?php
    require_once("db_connection.php");

    function createNavigation() {
        connectDatabase();
        $query =  "SELECT * ";
        $query .= "FROM subjects ";
        $query .= "ORDER BY position ASC";
        $result = queryDatabase($query);
        while($subject = mysqli_fetch_assoc($result)) {
            //do something
        }
        releaseResult();
    }
?>

问题是 - 我真的必须在 createNavigation 函数中释放本地 $result 还是没有必要?

mysqli_free_result 到底有什么用?来自其他 OOP 语言,我了解释放/销毁/禁用/清空对象、GC、内存管理等,但考虑到脚本只运行一次,返回一些内容并完成,我有点困惑它在 PHP 中的好处。谢谢!

4

2 回答 2

1

它是关于帮助 php 有效地管理资源的。如果您不调用它,那么该资源将被 php 清理,但最好自己调用它并在您知道不再需要它时立即将其删除。

举一个脚本的极端示例,该脚本需要一秒钟才能运行,其中数据库连接在开始时打开并且只需要非常短暂的时间。一旦脚本完成,资源(数据库连接等)将被释放,但连接可能已经打开,比需要的时间长 0.8 秒。现在添加多个并行访问页面的用户,您最终会在任何给定时间打开许多此连接的实例,而如果您立即清理连接,则需要更少的实例。

于 2013-08-04T00:40:52.050 回答
0

在实践中,这并不是特别必要的。大多数 PHP 脚本都是为通过 HTTP 访问而编写的,这意味着它们会短暂运行,然后停止,然后释放内存。我认为这很重要的唯一实际原因是,如果您正在运行持久性脚本,例如您构建为守护程序的脚本,您启动它并继续运行直到您停止它。在那个时候发布你的结果可以防止内存占用膨胀。

出于安全性、未来兼容性以及您说您来自 OOP 背景,您可能应该使用 PDO 而不是 mysqli_* 函数。要建立 MySQL 连接,您需要创建一个新的 PDO 对象。要释放资源,您只需取消设置对象(或结果,视情况而定)。

于 2013-08-04T00:38:34.367 回答