0

これは、ほとんどの 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_result は何に適していますか? 他のOOP言語から来て、オブジェクトの解放/破棄/無効化/null化、GC、メモリ管理などを理解していますが、スクリプトが1回だけ実行され、何かを返し、それが完了したことを考えると、PHPで何が良いのか少し混乱しています。ありがとうございました!

4

2 に答える 2

1

これは、php がリソースを効果的に管理できるようにするためのものです。呼び出さない場合、リソースはphpによってクリーンアップされますが、自分で呼び出して、不要になったことがわかったらすぐに削除することをお勧めします。

実行に 1 秒かかるスクリプトの極端な例を考えてみましょう。このスクリプトでは、最初にデータベース接続が開かれ、ごく短時間しか必要ありません。スクリプトが完了すると、リソース (データベース接続など) が解放されますが、接続が必要以上に 0.8 秒長く開いている可能性があります。複数のユーザーが同時にページにアクセスすると、この接続の多くのインスタンスが常に開いていることになりますが、接続をすぐにクリーンアップした場合は、必要なインスタンスが少なくなります。

于 2013-08-04T00:40:52.050 に答える