php mysql 连接不上_PHP: 连接状态 - Manual
連接狀態
插件改變了 PHP MySQL 連接的控制,新建連接會從一個連接池中獲取,用于替代 client-server
的單一連接方式。連接池包含一組 master 連接,和可選數目的 slave 連接。
連接池中的每一個連接都有自己的狀態,例如:SQL 用戶變量、臨時表、事物狀態。
所有的鏈接狀態可以參考 連接池與切換 說明。
如果插件決定要為負載均衡切換連接,應用可能得到一個不同狀態的鏈接。
應用必須能夠處理這些問題。
示例 #1 配置了一個 master 和一個 slave 的插件
{
"myapp": {
"master": {
"master_0": {
"host": "localhost",
"socket": "\/tmp\/mysql.sock"
}
},
"slave": {
"slave_0": {
"host": "192.168.2.27",
"port": "3306"
}
}
}
}
示例 #2 陷阱:連接狀態和 SQL 用戶變量
$mysqli=?newmysqli("myapp","username","password","database");
if?(!$mysqli)/*?Of?course,?your?error?handling?is?nicer...?*/die(sprintf("[%d]?%s\n",mysqli_connect_errno(),mysqli_connect_error()));/*?鏈接?1:綁定?SQL?用戶變量,因為沒有?SELECT?所以在?master?上執行?*/if?(!$mysqli->query("SET?@myrole='master'"))?{printf("[%d]?%s\n",$mysqli->errno,$mysqli->error);
}/*?連接?2:因為有?SELECT?所以在?slave?上執行?*/if?(!($res=$mysqli->query("SELECT?@myrole?AS?_role")))?{printf("[%d]?%s\n",$mysqli->errno,$mysqli->error);
}?else?{$row=$res->fetch_assoc();$res->close();printf("@myrole?=?'%s'\n",$row['_role']);
}$mysqli->close();?>
以上例程會輸出:
@myrole = ''
范例打開了負載均衡連接,并且執行兩個查詢。
第一個查詢 SET @myrole='master' 沒有以 SELECT
開頭。然而并不能識別這是一個應該在 slave 中執行的查詢,所以他被在 master 中執行。
所以這個變量被綁定在 master 連接中,master 連接設定被改變了。
然后執行 SELECT @myrole AS _role 查詢,差將將其識別為只讀查詢,
并且發送給 slave 服務器。這樣這個查詢不會獲得任何已經設定的 SQL 用戶變量。
這個變量被設定在了第一次使用的 master 連接上面。所以范例將打印
@myrole = ''。
這是開發人員必須注意的問題,插件并不會監控所有連接的變化情況。
若要監控所有的變化,將消耗大量的 CPU 資源。
當然這種陷阱,可以通過 SQL hints 解決。
總結
以上是生活随笔為你收集整理的php mysql 连接不上_PHP: 连接状态 - Manual的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java fx配置_JavaFX系列-配
- 下一篇: java iris_利用K-Means聚