この記事ではCodeIgniter読み書き分離実装方法について解説します。参考のために皆さんと共有してください。詳細は次のとおりです:
現在のサーバーはマスター/スレーブデバイスとしてのみ動作し、読み取り/書き込み分離の機能はプログラムによってのみ実装できます。 ここでは主に、Codeigniter が読み取り/書き込み分離を実装する方法について説明します。次の 2 つの点を満たす必要があります:
1. 読み取りと書き込みの分離は開発に対して透過的である必要があります。
複数の DB を手動でロードすることで読み取りと書き込みの分離を実現するソリューションがインターネット上にありますが、そのような分離はビジネスと密接に関係しすぎて、開発の難易度が高まり、メンテナンスに役立ちません。デフォルトで重いデータベースを読み取り、メインデータベースに書き込みます。読み取りと書き込みの分離は開発者にとって透過的です
2. シンプルな構成。
元の使用方法に影響を与えることなく、既存の構成方法を保持し、配列を追加することで読み取り/書き込み分離を構成します。
感想
1. 読み取りと書き込みの分離を実現する最も簡単なアイデアは、クエリが最終的に実行されるクエリ ステートメントに基づいて、メイン ライブラリに挿入するか、スレーブ ライブラリから読み取るかを決定することです。そのため、この関数を見つける必要があります。
2. データベースは 1 回だけ接続し、次回はリンクを再利用できる必要があります。つまり、データベースを再構築した後でもすべての読み取り操作が可能であり、メイン データベースにも再度接続する必要はありません。したがって、CI スーパー オブジェクトにリンクを置くことができます。
3. マスター/スレーブの判断は、最後に実行された SQL ステートメントに基づいて行われるため、デフォルトで接続されており、データベース設定の自動リンク autoinit パラメーターを true に設定する必要はありません。図書館ではリソースの無駄になります。
4. モデル内で $this->db を使用すると、他の調整を行わずにクエリを直接操作できます。
5. システム内のファイルを直接変更しないでください
読み書き分離を実現
CI の DB クラスはシステム下のファイルを読み取るように修正されており、これは適切な書き換えによって実現できます。 1 つ目は Loader.php で、データベース メソッドを使用してデータベース オブジェクトをロードします。これは、system/database/DB.php ファイルを参照し、カスタム DB.php ファイルがあるかどうかを判断し、存在する場合はインポートします。
Loader.phpを書き換える
リーリー次に、application/core の下に database/DB.php を作成します。このファイルには、設定ファイルの読み取りと初期化作業の実行に使用される DB メソッドが 1 つだけあります。また、書き直す必要がある箇所が 2 か所あります:
DB.phpを書き換える
リーリーDB.php 全体の調整は基本的にファイルの導入です。グループ名の導入は、導入しない場合はホスト名とデータベース名で設定できます。 autoint を強制的にオフにしたい場合は、DB.php 内の次の段落を削除できます:
リーリー次のステップは核心部分です。読み取りと書き込みの分離はクエリ ステートメントに基づいて実現されます。
DB_driver.php の simple_query メソッドは、SQL ステートメントを実行する最終メソッドとして理解でき、ここでデータベース リンクを判断できます。
DB_driver.phpを書き換える
リーリーここでは読み取りと書き込みの分離が基本的に実現されていますが、これをうまく行うには、パブリック コントローラーでの実行後に、リンクされたデータベース オブジェクトを閉じる必要があります。
DB_driver.php にも close メソッドがありますが、このメソッドで閉じることができるかどうかを検討できますか?ここではそれは不可能だと思います。
データベースリンクを閉じる
リーリー各モデルで $this->db を利用可能にし、データベースに複数回接続しないようにするために、モデルで使用され、リンクは CI スーパー オブジェクトにも配置されます。これは、読み取りと書き込みが分離されていない場合でも、コンストラクターでグループ名を渡すだけで、複数の DB を簡単に接続できます。
モデル調整
リーリー最終的なデータベース構成方法では、元の配列に基づいて配列を構成するだけで済みます。デュアルマスターを使用するか、1 つのマスターと複数のスレーブを使用するかは、ここでの構成によって異なります。最初はキー名を元の設定に直接追加することを考えましたが、マスターとスレーブの対応関係がまだ明確ではありません。ここでの定義によって、load_db_proxy_setting の実装が決まります。
database.php設定
リーリー初期のデータベースリンクはCIスーパーオブジェクトに配置されていません。複数のモデルをロードする際に毎回リンクが開かれることがわかります。読み取りと書き込みの分離が完了した後に必ずテストしてください。期待どおりに実行および終了されます (メソッドは application/core/database/drivers/mysql/mysql_driver.php の db_connect および _close に対応します)。調整プロセス全体で最も重要な 2 つのポイントは、simple_query メソッドとコンストラクターでのデータベース接続の終了です。モデル内の調整は、複数のライブラリをリンクしやすくするためであり、よく使用されるメソッドがファイルに分離され、MY_Model がそれを継承する場合にもこのように調整されます。
MYSQL の読み取りと書き込みの分離を実装するミドルウェアは数多くありますが、これらを使用しない場合は、プログラム制御によって読み取りと書き込みの分離を実現できます。もちろん、これは読み取りと書き込みの分離を実装するだけであり、メイン ライブラリの使用を強制することもできます。より良い割り当て方法が必要な場合は、load_db_proxy_setting での割り当て方法を検討できます。
CodeIgniter フレームワークに関連するさらなるコンテンツに興味のある読者は、このサイトの特別トピック「codeigniter チュートリアルの概要」および「CI (CodeIgniter) フレームワークの高度なチュートリアル」をチェックしてください。
この記事が、CodeIgniter フレームワークに基づく皆様の PHP プログラム設計に役立つことを願っています。