sql >> データベース >  >> RDS >> Mysql

接続用のMySQLiクラスパターン、閉じる、開いたままにしますか?

    良い習慣ではないと思います。これは特に1つの理由です。必要だと思う理由を説明する問題:リクエストごとに1つの接続のみ。

    何もコーディングする必要はありません。 mysqli デフォルトの接続である優れた機能が組み込まれています。新しいインスタンスを作成するたびに、ini設定(構成)からデータベース接続パラメーターを選択します。

    $db = new mysqli;
    

    スクリプトが終了するとすべてのデータベース接続が閉じられるため、気にする必要はほとんどありません。あなたがする必要がある唯一のことは、接続を一度インスタンス化し、そのmysqliを必要とするすべてのコードに変数を渡すことです。 オブジェクト。

    もう1つの悪い習慣は、シングルトン> ここでは、次のようなものです:

    class MysqliSingleton extends mysqli
    {
        private static $instance;
        /**
         * @return MysqliSingleton
         */
        public function getInstance()
        {
            if (NULL === self::$instance)
                self::$instance = new self();
            return self::$instance;
        }
        private function __construct()
        {
        }
        public function __clone()
        {
             throw new RuntimeException('Clone is not allowed.');
        }
        public function __wakeup()
        {
            throw new RuntimeException('Unserializing is not allowed.');
        }
    }
    

    これは次のように機能します:

    $mysqli = MysqliSingleton::getInstance();
    

    そして、常にその1つのmysqliインスタンスを返します。これは、探しているものである可能性があります。ただし、シングルトン 多くの問題を引き起こす可能性があるため、有害であると見なされます。関連する質問シングルトンが必要なのは誰ですか? を参照してください。 。

    データベースインスタンスを含む変数を自分で作成する方が簡単です。アプリケーションが常にmysqli接続を必要としない場合に備えて、ある種の遅延読み込みをさらにカプセル化することができます。非常に単純なコンテキストクラスを使用する場合:

    interface ContextMysqli
    {
        /**
         * @return mysqli
         */
        public function getMysqli();
    }
    
    class Context implements ContextMysqli
    {
        private $mysqli;
        public function getMysqli()
        {
            $this->mysqli || $this->mysqli = new mysqli();
            return $this->mysqli;
        }
    }
    

    スクリプトが開始したら、コンテキストをインスタンス化して、必要なコードのすべての部分に渡します。

    $context = new Context();
    ...
    $result = do_some_db_work($context);
    ...
    function do_some_db_work(ContextMysqli $context)
    {
        $mysqli = $context->getMysqli();
        ...
    }
    

    この提案も少し近視眼的かもしれませんが、あまり面倒なことはしませんが、シングルトンよりも優れています。利点は、mysqliを作成するときにロジックをカプセル化したことです。 シングルトンを必要としないオブジェクト。これで、コードはグローバルコンテキストまたは静的コンテキストに依存しなくなりました。



    1. レコード間の時間差

    2. リソースID#4 PHP MYSQL

    3. MySQLで1か月の日数を取得する方法

    4. codeigniterで特定のIDを持つ単一の最後のレコードを取得する方法