Laravel ist ein beliebtes PHP-Framework, das viele leistungsstarke Funktionen und Tools zum Entwickeln und Verwalten von Webanwendungen bietet. Eines der Hauptmerkmale ist die Trennung von Datenbank-Lesen und -Schreiben. In diesem Artikel wird erläutert, wie die Lese- und Schreibtrennung in Laravel-Anwendungen implementiert wird.
Was ist Lese-Schreib-Trennung?
Beim herkömmlichen Anwendungsdesign sendet die Anwendung normalerweise alle Datenbankoperationen an einen einzelnen Datenbankserver. Das bedeutet, dass sowohl das Lesen als auch das Schreiben von Daten über denselben Datenbankserver erfolgen muss. Bei Anwendungen mit hohem Datenverkehr kann dies zu einer übermäßigen Belastung des Datenbankservers und damit zu einer schlechten Leistung führen. Daher besteht eine Lösung darin, eine Lese- und Schreibtrennung für die Datenbank einzuführen.
Die Lese- und Schreibtrennung in der Datenbank ist eine Möglichkeit, Lesevorgänge von Schreibvorgängen zu trennen. Normalerweise senden Anwendungen Lesevorgänge an den Master-Datenbankserver und Schreibvorgänge an den Slave-Datenbankserver. Auf diese Weise trägt der Datenbankserver unter Bedingungen hoher Parallelität nicht mehr alle Lese- und Schreiblasten, wodurch Leistung und Skalierbarkeit verbessert werden.
Warum müssen wir das Lesen und Schreiben der Datenbank trennen?
In Anwendungen mit hohem Datenverkehr sind Datenbankoperationen ein sehr zeitaufwändiger Prozess. Wenn der Datenbankserver außerdem zu einem Engpass wird, nimmt die Leistung der gesamten Anwendung ab. Die Aufteilung von Datenbank-Lese- und Schreibvorgängen verbessert die Leistung und Skalierbarkeit, indem Lesevorgänge zusätzlich zum Master-Datenbankserver auf einen oder mehrere Slave-Server verlagert werden.
Wie erreicht man die Trennung von Lesen und Schreiben?
In einer Laravel-Anwendung kann die Lese-Schreib-Trennung aktiviert werden, indem Änderungen an der Datenbankkonfiguration vorgenommen werden. Hier sind einige Schritte:
In der Datei config/database.php finden Sie Konfigurationsinformationen zur Datenbankverbindung . Hier können Sie die Verbindungsparameter des Hauptdatenbankservers definieren:
'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, ], ],
Um die Lese-/Schreibtrennung zu aktivieren, Sie müssen eine Slave-Verbindung hinzufügen. Eine Slave-Verbindung kann erstellt werden, indem dieselben Parameter wie die Master-Verbindung kopiert und lediglich der Hostname und die Anmeldeinformationen der Verbindung geändert werden.
'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, ], ],
Der Name des Datenbankdienstes und die Konfigurationsinformationen des Slave-Servers können in der Konfiguration/Datenbank definiert werden .php-Datei. Hier können Sie ein Array verwenden, um mehrere Slave-Server zu definieren, jeder mit seinem eigenen Hostnamen und seinen eigenen Anmeldeinformationen.
'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', ], ], ],
In der Anwendung können Sie mit der folgenden Methode einen von mehreren Slave-Servern auswählen:
// 获取读取的模型 $model = new Post; // 从所有从服务器中随机选择一个 $results = $model->on('mysql_read')->inRandomOrder()->get();
Oder Sie können die folgende Methode verwenden, um manuell einen Slave-Server auszuwählen:
// 获取读取的模型 $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();
Zusammenfassung
Durch die Konfiguration der Lese-/Schreibtrennung können Lesevorgänge in der Anwendung auf „von“ verteilt werden des Servers, wodurch die Anwendungsleistung und Skalierbarkeit verbessert wird. In einer Laravel-Anwendung ist die Methode zur Lese-/Schreibtrennung einfach. Sie müssen lediglich die Datenbankverbindungskonfiguration ändern und eine Slave-Verbindung hinzufügen. Anschließend können Slave-Server mithilfe des Query Builders und Eloquent ORM ausgewählt werden.
Das obige ist der detaillierte Inhalt vonSo trennen Sie Lesen und Schreiben in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!