Laravel est un framework PHP populaire qui fournit de nombreuses fonctionnalités et outils puissants pour développer et maintenir des applications Web. L'une des fonctionnalités clés est la séparation de la lecture et de l'écriture de la base de données. Cet article explique comment implémenter la séparation en lecture et en écriture dans les applications Laravel.
Qu'est-ce que la séparation lecture-écriture ?
Dans la conception d'applications traditionnelles, les applications envoient généralement toutes les opérations de base de données à un seul serveur de base de données. Cela signifie que la lecture et l'écriture des données doivent être effectuées via le même serveur de base de données. Dans les applications à fort trafic, cela peut entraîner une charge excessive sur le serveur de base de données, entraînant de mauvaises performances. Par conséquent, une solution consiste à introduire une séparation en lecture et en écriture dans la base de données.
La séparation de lecture et d'écriture de base de données est un moyen de séparer les opérations de lecture des opérations d'écriture. En règle générale, les applications envoient des opérations de lecture au serveur de base de données maître et des opérations d'écriture au serveur de base de données esclave. De cette manière, dans des conditions de concurrence élevée, le serveur de base de données ne supporte plus toutes les charges de lecture et d'écriture, améliorant ainsi les performances et l'évolutivité.
Pourquoi devons-nous séparer la lecture et l'écriture de la base de données ?
Dans les applications à fort trafic, les opérations de base de données sont un processus très chronophage. De plus, si le serveur de base de données devient un goulot d'étranglement, les performances de l'ensemble de l'application se dégraderont. Le fractionnement lecture-écriture de la base de données améliore les performances et l'évolutivité en déchargeant les opérations de lecture sur un ou plusieurs serveurs esclaves en plus du serveur de base de données maître.
Comment parvenir à la séparation de la lecture et de l'écriture ?
Dans les applications Laravel, la séparation lecture-écriture peut être activée en apportant des modifications à la configuration de la base de données. Voici quelques étapes :
Dans le fichier config/database.php, vous pouvez trouver des informations de configuration sur la connexion à la base de données. Ici, vous pouvez définir les paramètres de connexion du serveur de base de données maître :
'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, ], ],
Pour activer la séparation lecture-écriture, vous devez ajouter une connexion esclave. Une connexion esclave peut être créée en copiant les mêmes paramètres que la connexion maître, en modifiant simplement le nom d'hôte et les informations d'identification de la connexion.
'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, ], ],
Vous pouvez définir le nom du service de base de données et les informations de configuration du serveur esclave dans le fichier config/database.php. Ici, vous pouvez utiliser un tableau pour définir plusieurs serveurs esclaves, chacun avec son propre nom d'hôte et ses propres informations d'identification.
'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', ], ], ],
Dans l'application, vous pouvez en sélectionner un parmi plusieurs esclaves en utilisant :
// 获取读取的模型 $model = new Post; // 从所有从服务器中随机选择一个 $results = $model->on('mysql_read')->inRandomOrder()->get();
Ou vous pouvez sélectionner manuellement un esclave en utilisant :
// 获取读取的模型 $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();
Résumé
Configuration La séparation en lecture-écriture peut améliorer les performances de l'application et l'évolutivité en distribuant les opérations de lecture dans une application aux serveurs esclaves. Dans une application Laravel, la méthode pour réaliser la séparation lecture-écriture est simple. Il vous suffit de modifier la configuration de la connexion à la base de données et d'ajouter une connexion esclave. Les serveurs esclaves peuvent ensuite être sélectionnés à l'aide du générateur de requêtes et d'Eloquent ORM.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!