PHP melaksanakan pemisahan baca-tulis MySQL dan perlu melaksanakan fungsi berikut:
1 Bezakan antara operasi baca dan tulis: Dalam kod PHP, pangkalan data operasi perlu dilakukan Untuk membezakan, letakkan operasi baca dan tulis pada contoh MySQL yang berbeza.
Anda perlu mereka bentuk penyelesaian pengimbangan beban untuk mengagihkan permintaan baca secara sama rata kepada berbilang kejadian MySQL dengan menggunakan algoritma yang berbeza.
Di bawah, kami akan memperkenalkan secara terperinci cara melaksanakan fungsi di atas.
Bezakan antara operasi baca dan tulis
Pelaksanaan pemisahan baca dan tulis MySQL memerlukan sokongan teknologi replikasi tuan-hamba MySQL. Dalam replikasi hamba induk MySQL, semua operasi tulis dilakukan dalam pangkalan data induk, manakala hanya operasi baca dilakukan dalam pangkalan data hamba.
Dalam kod PHP, operasi baca dan tulis MySQL perlu dibezakan operasi Tulis dihantar ke perpustakaan utama, manakala operasi baca dihantar ke perpustakaan hamba.
Dua kaedah berikut boleh digunakan untuk pelaksanaan khusus:
1 Pensuisan sambungan manual: Tukar sambungan secara manual untuk operasi baca dan tulis dalam kod. Sambungkan pangkalan data utama dan pangkalan data hamba pada contoh MySQL yang berbeza seperti yang diperlukan, dan laksanakan pernyataan SQL yang sepadan.
Contohnya, untuk pernyataan SQL berikut:
SELECT * FROM users WHERE age>18;
Anda boleh menggunakan kod berikut untuk melaksanakan sambungan pensuisan untuk operasi baca:
//生成一个读取从库的连接 $slaveConn = mysqli_connect($slaveHost, $slaveUser, $slavePass, $dbName); mysqli_query($slaveConn, "SET NAMES utf8"); //查询数据 $result = mysqli_query($slaveConn, "SELECT * FROM users WHERE age>18");
Begitu juga, untuk operasi tulis:
INSERT INTO users (name,age,sex) VALUES ('jack',18,'male');
Kod berikut boleh digunakan untuk menukar sambungan untuk operasi tulis:
//生成一个写入主库的连接 $masterConn = mysqli_connect($masterHost, $masterUser, $masterPass, $dbName); mysqli_query($masterConn, "SET NAMES utf8"); //插入数据 $result = mysqli_query($masterConn, "INSERT INTO users (name,age,sex) VALUES ('jack',18,'male')");
Dalam kod di atas, fungsi mysqli_connect digunakan untuk menjana sambungan pangkalan data, dan kaedah mysqli_query digunakan untuk beroperasi pangkalan data MySQL. Antaranya, $slaveHost, $slaveUser, dan $slavePass ialah maklumat sambungan perpustakaan hamba, dan $masterHost, $masterUser dan $masterPass ialah maklumat sambungan perpustakaan induk.
Anda boleh menggunakan pelaksanaan terbina dalam dalam rangka kerja PHP untuk bertukar antara operasi baca dan tulis. Dalam rangka kerja Yii2, kod berikut boleh digunakan untuk bertukar antara operasi baca dan tulis:
//生成一个读取从库的连接 $slaveConn = Yii::$app->slaveDb->getConnection(); //查询数据 $query = new \yii\db\Query(); $result = $query->from('users')->where(['age' > 18])->all($slaveConn);
Begitu juga, gunakan kod berikut untuk bertukar antara operasi tulis:
//生成一个写入主库的连接 $masterConn = Yii::$app->masterDb->getConnection(); //插入数据 $result = Yii::$app->db->createCommand()->insert('users', [ 'name' => 'jack', 'age' => 18, 'sex' => 'male' ])->execute($masterConn);
Dalam kod di atas, Yii::$app ->slaveDb dan Yii::$app->masterDb ialah kedua-dua komponen sambungan pangkalan data terbina dalam rangka kerja Yii2, menyediakan kaedah untuk membaca daripada perpustakaan hamba dan menulis ke pustaka induk.
Strategi pengimbangan beban
Untuk pelaksanaan pemisahan baca dan tulis MySQL, pengimbangan beban adalah bahagian yang sangat penting. Hanya jika semua permintaan baca diedarkan sama rata pada setiap pangkalan data hamba, kelebihan pemisahan baca dan tulis MySQL dapat digunakan sepenuhnya.
Strategi pengimbangan beban yang biasa digunakan termasuk:
1 Strategi rawak: mengedarkan permintaan baca secara rawak kepada setiap pangkalan data hamba.
2. Strategi pengundian: peruntukkan permintaan baca kepada setiap perpustakaan hamba secara bergilir-gilir dan gunakannya secara kitaran.
3. Strategi keutamaan ketersediaan: Gunakan kaedah pemantauan ketersediaan untuk memilih perpustakaan hamba yang tersedia sebelum operasi membaca.
Artikel ini menggunakan strategi pengundian dan pelaksanaan khusus adalah seperti berikut:
//从库连接信息 $slave1 = array( 'host' => 'slave1.host.com', 'user' => 'slave1user', 'pass' => 'slave1pass', 'name' => 'dbname' ); $slave2 = array( 'host' => 'slave2.host.com', 'user' => 'slave2user', 'pass' => 'slave2pass', 'name' => 'dbname' ); $slave3 = array( 'host' => 'slave3.host.com', 'user' => 'slave3user', 'pass' => 'slave3pass', 'name' => 'dbname' ); //增加从库列表 $slaveList = array($slave1, $slave2, $slave3); //轮询获取从库连接信息 function getSlaveConn() { global $slaveList; static $index = 0; if ($index >= count($slaveList)) { $index = 0; } $slave = $slaveList[$index]; $index++; $conn = mysqli_connect($slave['host'], $slave['user'], $slave['pass'], $slave['name']); mysqli_query($conn, "SET NAMES utf8"); return $conn; }
Dalam kod di atas, $slave1, $slave2, $slave3 ialah maklumat sambungan perpustakaan hamba dan $slaveList ialah senarai perpustakaan hamba. Dalam fungsi getSlaveConn, $index ialah bilangan sambungan ke perpustakaan hamba Apabila bilangan sambungan adalah sama dengan panjang senarai perpustakaan hamba, $index ditetapkan semula kepada sifar dan sambungan disambungkan semula daripada perpustakaan hamba pertama. Setiap kali anda menyambung ke perpustakaan hamba, gunakan fungsi mysqli_connect untuk menyambung ke pangkalan data.
Melalui pelaksanaan di atas, fungsi PHP untuk merealisasikan pemisahan baca dan tulis MySQL telah dilaksanakan. Anda boleh menggunakan kod di atas untuk melaksanakan fungsi pemisahan baca-tulis MySQL dalam aplikasi PHP, dan menambah atau mengubah suai strategi pengimbangan beban mengikut keperluan.
Dalam kes konkurensi yang tinggi dan volum data yang besar, menggunakan PHP untuk memisahkan pembacaan dan penulisan MySQL dengan berkesan boleh meningkatkan prestasi membaca dan menulis pangkalan data MySQL, mengurangkan masa tindak balas aplikasi dan menambah baik pengguna pengalaman.
Atas ialah kandungan terperinci Bagaimana untuk mencapai pemisahan membaca dan menulis dalam php+mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!