ThinkPHP6 でデータベースの水平サブデータベース操作を?qū)g行するにはどうすればよいですか?
Jun 12, 2023 am 11:39 AMビジネス規(guī)模の拡大に伴い、データベースで処理する必要のあるデータ量も増加しており、単一のデータベースでは逼迫しています?,F(xiàn)時點では、データベースの水平サブデータベース操作を?qū)g行してデータを異なるデータベースに分散し、それによってシステムのパフォーマンスとスケーラビリティを向上させる必要があります。この記事では、ThinkPHP6 でデータベースの水平シャーディング操作を?qū)g行する方法を紹介します。
1. データベース水平サブデータベースとは何ですか?
データベースの水平シャーディングは、1 つのデータベース內(nèi)のデータを複數(shù)のデータベースに分散するプロセスです。特定のルール (ユーザー ID や期間など) に従ってデータを異なるデータベースに分割することで、単一データベースへの負荷を軽減できます。同時に、データ量が多い場合、水平シャーディングによりクエリ効率が向上し、データのセキュリティが強化されます。
2. ThinkPHP6 での水平サブライブラリの実裝
ThinkPHP6 では、データベースミドルウェアを使用して水平サブライブラリを?qū)g裝できます。 ThinkPHP6 の MySQL 接続にデータベースミドルウェアを配置し、サブデータベースを制御します。
- Thinkswoole のインストール
ThinkPHP6 では、データベースミドルウェアとして Thinkswoole が使用されています。プロジェクトに Thinkswoole をインストールする必要があります。
ThinkSwoole のバージョン情報をcomposer.json ファイルに追加し、composer を使用してインストールします。
- データベース構(gòu)成を変更する
まず config/database.php ファイルを見つけて、MySQL 接続を Swoole 接続に置き換えます。元の MySQL 接続情報をコメントアウトします:
// 'mysql' => [ // // 默認數(shù)據(jù)連接標(biāo)識 // 'default' => env('database.driver', 'mysql'), // // 數(shù)據(jù)庫連接信息 // 'connections' => [ // 'mysql' => [ // // 數(shù)據(jù)庫類型 // 'type' => 'mysql', // // 主機地址 // 'host' => env('database.hostname', '127.0.0.1'), // // 數(shù)據(jù)庫名 // 'database' => env('database.database', ''), // // 用戶名 // 'username' => env('database.username', 'root'), // // 密碼 // 'password' => env('database.password', ''), // // 端口 // 'hostport' => env('database.hostport', '3306'), // // 數(shù)據(jù)庫連接參數(shù) // 'params' => [], // // 數(shù)據(jù)庫編碼默認采用utf8 // 'charset' => 'utf8', // // 數(shù)據(jù)庫表前綴 // 'prefix' => env('database.prefix', ''), // // 數(shù)據(jù)庫調(diào)試模式 // 'debug' => env('database.debug', true), // // 數(shù)據(jù)庫部署方式:0 集中式(單一服務(wù)器),1 分布式(主從服務(wù)器) // 'deploy' => 0, // // 數(shù)據(jù)庫讀寫是否分離 主從式有效 // 'rw_separate' => false, // // 讀寫分離后 主服務(wù)器數(shù)量 // 'master_num' => 1, // // 指定從服務(wù)器序號 // 'slave_no' => '', // // 是否嚴格檢查字段是否存在 // 'fields_strict' => true, // // 數(shù)據(jù)集返回類型 // 'resultset_type' => 'array', // // 自動寫入時間戳字段 // 'auto_timestamp' => false, // // 時間字段取出后的默認時間格式 // 'datetime_format' => false, // // Builder類 // 'builder' => '', // // Query類 // 'query' => '\think\db\Query', // // 是否需要進行SQL性能分析 // 'sql_explain' => false, // ], // ], // ],
Swoole 接続情報を追加します:
// swoole 'swoole' => [ // 默認數(shù)據(jù)連接標(biāo)識 'default' => 'swoole', // 數(shù)據(jù)庫連接信息 'connections' => [ 'swoole' => [ // 數(shù)據(jù)庫類型 'type' => 'mysql', // 服務(wù)器地址 'hostname' => [ '127.0.0.1:3305', '127.0.0.1:3306', ], // 數(shù)據(jù)庫名 'database' => 'test', // 用戶名 'username' => 'root', // 密碼 'password' => '', // 端口 'hostport' => '', // 數(shù)據(jù)庫連接參數(shù) 'params' => [], // 數(shù)據(jù)庫編碼默認采用utf8mb4 'charset' => 'utf8mb4', // 數(shù)據(jù)庫表前綴 'prefix' => '', // 數(shù)據(jù)庫調(diào)試模式 'debug' => true, // 數(shù)據(jù)庫部署方式:0 集中式(單一服務(wù)器),1 分布式(主從服務(wù)器) 'deploy' => 0, // 數(shù)據(jù)庫讀寫是否分離 主從式有效 'rw_separate' => false, // 讀寫分離后 主服務(wù)器數(shù)量 'master_num' => 1, // 指定從服務(wù)器序號 'slave_no' => '', // 自動寫入時間戳字段 'auto_timestamp' => false, // 時間字段取出后的默認時間格式 'datetime_format' => 'Y-m-d H:i:s', // Builder類 'builder' => '', // Query類 'query' => '\think\db\Query', // 是否需要進行SQL性能分析 'sql_explain' => false, ], ], ],
上記のコードでは、2 つのサーバー アドレス (127.0.0.1:3305 と 127.0.0.1:3306 ) を定義しました。 , これは複數(shù)のデータノードのサブライブラリを?qū)g裝するためです。データベース名、ユーザー名、パスワードなどの情報は変更されません。
- データベース ミドルウェアの作成
Db.php のデータベース ミドルウェアを app/middleware ディレクトリに作成し、次のコードを追加します:
<?php namespace appmiddleware; use thinkRequest; use thinkContainer; class Db { public function handle(Request $request, Closure $next) { $serverIds = $this->getServerIds($request); //定義一個連接池 $conns = []; foreach($serverIds as $sid) { $sid = $request->$sid; if(empty($conns[$sid])) { $conns[$sid] = Container::getInstance() ->make('db')->connect($sid); } } Container::getInstance()->bind('db', function() use ($conns) { return $conns; }); return $next($request); } protected function getServerIds(Request $request) { return ['uid']; } }
ここに作成Db というミドルウェアが作成されます。 handle メソッドでは、まず現(xiàn)在のリクエストのサーバー ID 配列を取得します。次に、これらのサーバー アドレスを接続プール $cons 內(nèi)の既存のアドレスと比較し、存在しない場合は接続プールに追加します。最後に、接続プール $conns をコンテナー インスタンスにバインドします。 getServerIds メソッドでは、サーバー ID の名前を設(shè)定できます。デフォルトは uid です。
- ミドルウェアの登録
次のコードを config/middleware.php に追加します:
return [ ... appmiddlewareDb::class, ];
このコードはミドルウェアの登録に使用されます。Db ミドルウェアを追加しました。ミドルウェア実行アクティビティのリストに追加します。
- サブライブラリ操作の実裝
次に、モデルに水平サブライブラリ操作を?qū)g裝します。ユーザーテーブルを例にとると、ユーザー ID はデータベースの制限として 100,000 と 100,000 に分割されます。これは、ユーザー ID が 0 から 100,000 までのデータがデータベースに格納されることを意味し、ユーザー ID が一致するまで続きます。 10 番目のデータベースには 90 萬から 100 萬件のデータが格納されます。
<?php namespace appmodel; use thinkModel; class User extends Model { protected $connection = [ 1 => 'user_1', 2 => 'user_2', 3 => 'user_3', 4 => 'user_4', 5 => 'user_5', 6 => 'user_6', 7 => 'user_7', 8 => 'user_8', 9 => 'user_9', 10 => 'user_10', ]; protected $pk = 'uid'; public function getTableName(): string { $id = ceil($this->id / 100000); return $this->connection[$id] . '.' . $this->table; } }
ここでは 10 個のデータベース接続を定義します。各接続はデータベース シャードを表し、水平シャーディングの目的を達成します。次に、現(xiàn)在のモデルに対応するデータ テーブル名を取得する getTableName メソッドを定義します。モデル內(nèi)の主キー ID 値に基づいてアクセスする必要があるデータベース接続を計算し、データベース接続とデータ テーブル名の組み合わせを返します。
概要:
この記事では、ThinkPHP6 の水平サブライブラリ操作を紹介します。ビジネスが拡大し続け、データの規(guī)模が増大するにつれて、水平シャーディングによってシステムのパフォーマンスと拡張性が向上し、データのセキュリティも強化されます。 ThinkPHP6 では、Thinkswoole ミドルウェアおよびその他のメソッドを使用して、水平サブライブラリ操作を?qū)g裝できます。
以上がThinkPHP6 でデータベースの水平サブデータベース操作を?qū)g行するにはどうすればよいですか?の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ThinkPHP プロジェクトを?qū)g行するには、Composer をインストールし、Composer を使用してプロジェクトを作成し、プロジェクト ディレクトリに入り、php bin/consoleserve を?qū)g行し、http://localhost:8000 にアクセスしてようこそページを表示する必要があります。

ThinkPHP には、さまざまな PHP バージョン向けに設(shè)計された複數(shù)のバージョンがあります。メジャー バージョンには 3.2、5.0、5.1、および 6.0 が含まれますが、マイナー バージョンはバグを修正し、新機能を提供するために使用されます。最新の安定バージョンは ThinkPHP 6.0.16 です。バージョンを選択するときは、PHP バージョン、機能要件、コミュニティ サポートを考慮してください。最高のパフォーマンスとサポートを得るには、最新の安定バージョンを使用することをお勧めします。

ThinkPHP フレームワークをローカルで実行する手順: ThinkPHP フレームワークをローカル ディレクトリにダウンロードして解凍します。 ThinkPHP ルート ディレクトリを指す仮想ホスト (オプション) を作成します。データベース接続パラメータを構(gòu)成します。 Webサーバーを起動します。 ThinkPHP アプリケーションを初期化します。 ThinkPHP アプリケーションの URL にアクセスして実行します。

Laravel フレームワークと ThinkPHP フレームワークのパフォーマンスの比較: ThinkPHP は、最適化とキャッシュに重點を置いて、一般に Laravel よりもパフォーマンスが優(yōu)れています。 Laravel は優(yōu)れたパフォーマンスを発揮しますが、複雑なアプリケーションの場合は、ThinkPHP の方が適している可能性があります。

ThinkPHP のインストール手順: PHP、Composer、および MySQL 環(huán)境を準備します。 Composer を使用してプロジェクトを作成します。 ThinkPHP フレームワークと依存関係をインストールします。データベース接続を構(gòu)成します。アプリケーションコードを生成します。アプリケーションを起動し、http://localhost:8000 にアクセスします。

ThinkPHP は、キャッシュ メカニズム、コードの最適化、並列処理、データベースの最適化などの利點を備えた高性能 PHP フレームワークです。公式パフォーマンステストでは、1秒あたり10,000以上のリクエストを処理できることが示されており、実際のアプリケーションではJD.comやCtripなどの大規(guī)模なWebサイトやエンタープライズシステムで広く使用されています。

開発の提案: API 開発に ThinkPHP フレームワークを使用する方法 インターネットの継続的な発展に伴い、API (アプリケーション プログラミング インターフェイス) の重要性がますます高まっています。 API は、異なるアプリケーション間の通信の橋渡しとなるもので、データの共有や関數(shù)の呼び出しなどを?qū)g現(xiàn)し、開発者に比較的簡単かつ迅速な開発手法を提供します。優(yōu)れた PHP 開発フレームワークである ThinkPHP フレームワークは、効率的でスケーラブルで使いやすいです。

「開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを?qū)g裝する方法」 インターネット技術(shù)の急速な発展に伴い、Web アプリケーションには、多數(shù)の同時リクエストと複雑なビジネス ロジックを処理するための要件が??ますます高まっています。システムのパフォーマンスとユーザー エクスペリエンスを向上させるために、開発者は多くの場合、電子メールの送信、ファイルのアップロードの処理、レポートの生成など、時間のかかる操作を?qū)g行するために非同期タスクの使用を検討します。 PHP の分野では、人気のある開発フレームワークとして ThinkPHP フレームワークが、非同期タスクを?qū)g裝するための便利な方法をいくつか提供しています。
