2

私はphp/mysqlを学んでいます。いくつかの質問に対する決定的な答えが見つからないようです..それらのいくつかを明確にするか、信頼できる情報源を教えてもらえますか. ありがとう。

(1)データベースオブジェクトがもう必要ない場合、オブジェクトの設定を解除すると、関連するすべてのリソース(接続/結果を保持するメモリなど)が解放されますか、または呼び出す前に$mysqliResult->free()and/orを呼び出す必要がありますか。$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 を使用する場合、一度に 1 つの準備されたステートメント/実行のみを持つことができます。閉じずに 2 つの準備済みステートメントを開いて実行しようとすると、エラーが発生します。データベース アブスクタを超えて明示的に開いたリソースは、実行時に処理する必要があります。つまり、abstractor の情報を使用して接続を開く場合は、明示的に閉じることをお勧めします (ただし、基本リソース自体を設定解除しないでください)。これにより、それに関連付けられているリソースが解放されます。基本的な mysql 接続を持つことはリソースをあまり消費しませんが、mysql サーバーへの多数の閉じられていない接続を保持すると、接続の受け入れを停止する可能性があります (構成によって異なります)。ほとんどの実行では、実行時に関連する mysql リソースが明示的に解放されていない場合、完了時に自動的に解放されます。

これが役立つかどうか教えてください。

于 2013-11-09T20:16:31.980 に答える