在PHP中实现MySQL的读写分离,通常涉及到主从复制(Master-Slave Replication)的概念。以下是一个基本的实现步骤和示例代码:
首先,你需要配置MySQL的主从复制。假设你有一个主数据库(Master)和一个从数据库(Slave)。
编辑my.cnf
或my.ini
文件:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=your_database_name
重启MySQL服务使配置生效。
编辑my.cnf
或my.ini
文件:
[mysqld]
server-id=2
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1
重启MySQL服务使配置生效。
连接到主数据库并获取当前的复制状态:
<?php
$master_host = 'master_host_ip';
$master_user = 'master_username';
$master_password = 'master_password';
$master_db = 'your_database_name';
$conn = new mysqli($master_host, $master_user, $master_password, $master_db);
if ($conn->connect_error) {
die('Connection failed: ' . $conn->connect_error);
}
$sql = "SHOW SLAVE STATUS\G";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "Slave_IO_Running: " . $row['Slave_IO_Running'] . "\n";
echo "Slave_SQL_Running: " . $row['Slave_SQL_Running'] . "\n";
if ($row['Slave_IO_Running'] == 'Yes' && $row['Slave_SQL_Running'] == 'Yes') {
echo "Replication is running.\n";
} else {
echo "Replication is not running.\n";
}
}
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
根据读取和写入操作选择不同的数据库连接。
<?php
$write_host = 'master_host_ip';
$write_user = 'master_username';
$write_password = 'master_password';
$write_db = 'your_database_name';
$write_conn = new mysqli($write_host, $write_user, $write_password, $write_db);
if ($write_conn->connect_error) {
die('Connection failed: ' . $write_conn->connect_error);
}
// 插入数据示例
$sql = "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')";
if ($write_conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $write_conn->error;
}
$write_conn->close();
?>
<?php
$read_host = 'slave_host_ip';
$read_user = 'slave_username';
$read_password = 'slave_password';
$read_db = 'your_database_name';
$read_conn = new mysqli($read_host, $read_user, $read_password, $read_db);
if ($read_conn->connect_error) {
die('Connection failed: ' . $read_conn->connect_error);
}
// 查询数据示例
$sql = "SELECT * FROM your_table";
$result = $read_conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
}
} else {
echo "0 results";
}
$read_conn->close();
?>
为了提高性能和稳定性,可以考虑使用连接池来管理数据库连接。PHP中有许多连接池库,如PDO
或HikariCP
。
以上是一个基本的MySQL读写分离实现示例。实际应用中可能需要更多的错误处理和优化,例如使用连接池、监控复制状态、自动故障转移等。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。