ホームページ >PHPフレームワーク >Laravel >Laravelで読み取りと書き込みを分離する方法

Laravelで読み取りと書き込みを分離する方法

WBOY
WBOYオリジナル
2023-05-20 19:44:35964ブラウズ

Laravel は、Web アプリケーションを開発および保守するための多くの強力な機能とツールを提供する人気のある PHP フレームワークです。重要な機能の 1 つは、データベースの読み取りと書き込みを分離していることです。この記事では、Laravelアプリケーションで読み取りと書き込みの分離を実装する方法を紹介します。

読み取りと書き込みの分離とは何ですか?

従来のアプリケーション設計では、アプリケーションは通常、すべてのデータベース操作を単一のデータベース サーバーに送信します。これは、データの読み取りと書き込みの両方を同じデータベース サーバーを通じて行う必要があることを意味します。トラフィックの多いアプリケーションでは、データベース サーバーに過度の負荷がかかり、パフォーマンスが低下する可能性があります。したがって、1 つの解決策は、データベースの読み取りと書き込みを分離することです。

データベースの読み取りと書き込みの分離は、読み取り操作を書き込み操作から分離する方法です。通常、アプリケーションは読み取り操作をマスター データベース サーバーに送信し、書き込み操作をスレーブ データベース サーバーに送信します。このようにして、同時実行性が高い条件下では、データベース サーバーが読み取りおよび書き込みのすべての負荷を負担することがなくなり、パフォーマンスとスケーラビリティが向上します。

データベースの読み取りと書き込みを分離する必要があるのはなぜですか?

高トラフィックのアプリケーションでは、データベース操作は非常に時間のかかるプロセスです。また、データベースサーバーがボトルネックになると、アプリケーション全体のパフォーマンスが低下します。データベースの読み取り/書き込み分割により、読み取り操作がマスター データベース サーバーに加えて 1 つ以上のスレーブ サーバーにオフロードされるため、パフォーマンスとスケーラビリティが向上します。

読み取りと書き込みを分離するにはどうすればよいですか?

Laravel アプリケーションでは、データベース構成を変更することで読み取りと書き込みの分離を有効にすることができます。以下にいくつかの手順を示します。

  1. データベース接続の構成

config/database.php ファイルには、データベース接続に関する構成情報があります。ここで、マスター データベース サーバーの接続パラメータを定義できます。

'connections' => [
  'mysql' => [
      'driver'      => 'mysql',
      'host'        => env('DB_HOST', 'localhost'),
      'database'    => env('DB_DATABASE', 'forge'),
      'username'    => env('DB_USERNAME', 'forge'),
      'password'    => env('DB_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],
],
  1. スレーブ接続の追加

読み取りと書き込みの分離を有効にするには、スレーブを追加する必要があります。繋がり。スレーブ接続は、マスター接続と同じパラメータをコピーし、接続のホスト名と資格情報を変更するだけで作成できます。

'connections' => [
  'mysql' => [
      'driver'      => 'mysql',
      'host'        => env('DB_HOST', 'localhost'),
      'database'    => env('DB_DATABASE', 'forge'),
      'username'    => env('DB_USERNAME', 'forge'),
      'password'    => env('DB_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],

  'mysql_read' => [
      'driver'      => 'mysql',
      'host'        => env('DB_READ_HOST', 'localhost'),
      'database'    => env('DB_READ_DATABASE', 'forge'),
      'username'    => env('DB_READ_USERNAME', 'forge'),
      'password'    => env('DB_READ_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],
],
  1. データベース サービスの構成

データベース サービスの名前とスレーブ サーバーの構成情報を config/database.php ファイルで定義できます。ここでは、配列を使用して、それぞれが独自のホスト名と資格情報を持つ複数のスレーブ サーバーを定義できます。

'connections' => [
  'mysql' => [
      'driver'      => 'mysql',
      'host'        => env('DB_HOST', 'localhost'),
      'database'    => env('DB_DATABASE', 'forge'),
      'username'    => env('DB_USERNAME', 'forge'),
      'password'    => env('DB_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],

  'mysql_read' => [
      'driver'      => 'mysql',
      'host'        => env('DB_READ_HOST', 'localhost'),
      'database'    => env('DB_READ_DATABASE', 'forge'),
      'username'    => env('DB_READ_USERNAME', 'forge'),
      'password'    => env('DB_READ_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],
],

'service' => [
  'mysql' => [
      'write' => 'mysql',
      'read'  => [
          'mysql_read',
      ],
  ],
],
  1. スレーブ サーバーの選択

アプリケーションでは、

// 获取读取的模型
$model = new Post;

// 从所有从服务器中随机选择一个
$results = $model->on('mysql_read')->inRandomOrder()->get();

を使用して複数のスレーブ サーバーから 1 つを選択できます。または、次を使用できます。メソッドは、スレーブ サーバーを手動で選択するために使用されます:

// 获取读取的模型
$model = new Post;

// 手动选择第一个从服务器
$config = config('database.connections.mysql_read');
$conn = DB::connection('mysql_read');
$conn->setPdo($conn->createConnector($config)->connect());
$results = $model->setConnection($conn)->inRandomOrder()->get();

summary

読み取りと書き込みの分離を構成すると、アプリケーションの読み取り操作をスレーブ サーバーに分散できるため、アプリケーションのパフォーマンスと可用性が向上します。 . スケーラビリティ。 Laravel アプリケーションでは、読み取りと書き込みの分離を実現する方法は簡単で、データベースの接続構成を変更し、スレーブ接続を追加するだけです。その後、クエリ ビルダーと Eloquent ORM を使用してスレーブ サーバーを選択できます。

以上がLaravelで読み取りと書き込みを分離する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。