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