這裡有一個很棒的小類別,它可以使用持續連線在多個複製的 MySQL 伺服器實例之間進行負載平衡,並自動從池中移除失敗的 MySQL 伺服器。
您只會將此用於查詢,絕不會用於插入/更新/刪除,除非您有多主機情況,其中對任何資料庫伺服器的更新會自動複製到其他伺服器(我不確定 MySQL 是否可以做到這一點)。
使用此類別,您可以像這樣獲得與 MySQL 伺服器的連線
$con = MySQLConnectionFactory::create();
這是類別(您需要為您的組態自訂 $SERVERS 陣列 -- 請注意,您可能會對所有伺服器使用相同的用戶名、密碼和資料庫,僅更改主機名稱,但您並非必須使用相同的)。
<?php
class MySQLConnectionFactory {
static $SERVERS = array(
array(
'host' => 'myHost1',
'username' => 'myUsername1',
'password' => 'myPassword1',
'database' => 'myDatabase1'),
array(
'host' => 'myHost2',
'username' => 'myUsername1',
'password' => 'myPassword2',
'database' => 'myDatabase2')
);
public static function create() {
$cons = array();
for ($i = 0, $n = count(MySQLConnectionFactory::$SERVERS); $i < $n; $i++) {
$server = MySQLConnectionFactory::$SERVERS[$i];
$con = mysql_pconnect($server['host'], $server['username'], $server['password']);
if (!($con === false)) {
if (mysql_select_db($server['database'], $con) === false) {
echo('無法選擇資料庫:' . mysql_error());
continue;
}
$cons[] = $con;
}
}
if (count($cons) == 0) {
throw new Exception
('無法連線到任何資料庫伺服器 - 最後一個錯誤:' . mysql_error());
}
$serverIdx = rand(0, count($cons)-1);
$con = $cons[$serverIdx];
return $con;
}
}
?>