Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.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:何时从DB发布结果?_Php_Database_Memory_Mysqli - Fatal编程技术网

PHP:何时从DB发布结果?

PHP:何时从DB发布结果?,php,database,memory,mysqli,Php,Database,Memory,Mysqli,我想这将是一个相当基本的问题,你们大多数PHP的家伙在那里。假设我有一个与DB一起工作的文件: <?php define("DB_HOST", "localhost"); define("DB_NAME", "dbname"); define("DB_USER", "admin"); define("DB_PASSWORD", "abcdefg"); $connection; $result; function connectDa

我想这将是一个相当基本的问题,你们大多数PHP的家伙在那里。假设我有一个与DB一起工作的文件:

<?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_结果到底有什么好处?来自其他OOP语言,我了解释放/销毁/禁用/清空对象、GC、内存管理等。但考虑到脚本只运行一次,返回一些东西,然后就完成了,我有点困惑它在PHP中的好处。谢谢大家!

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


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

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


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

谢谢,我将检查PDO。