這篇文章主要介紹了PHP同時連接多個mysql數(shù)據(jù)庫的具體實(shí)現(xiàn),需要的朋友可以參考下
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比虎丘網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式虎丘網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋虎丘地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
實(shí)例:
代碼如下:
?php
$conn1
=
mysql_connect("127.0.0.1",
"root","root","db1");
mysql_select_db("db1",
$conn1);
$conn2
=
mysql_connect("127.0.0.1",
"root","root","db2");
mysql_select_db("db2",
$conn2);
$sql
=
"select
*
from
ip";
$query
=
mysql_query($sql);
if($row
=
mysql_fetch_array($query))
echo
$row[0]."n";
$sql
=
"select
*
from
web
";
$query
=
mysql_query($sql);
if($row
=
mysql_fetch_array($query))
echo
$row[0];
?
這段代碼存在問題,在程序執(zhí)行時會報(bào)錯:PHP
Warning:
mysql_fetch_array()
expects
parameter
1
to
be
resource,
boolean
given
in
....
原因分析:
程序開始建立兩個數(shù)據(jù)庫鏈接,函數(shù)mysql_query()原型:
resource
mysql_query
(
string
$query
[,
resource
$link_identifier
]
)
向與指定的連接標(biāo)識符關(guān)聯(lián)的服務(wù)器中的當(dāng)前活動數(shù)據(jù)庫發(fā)送一條查詢。如果沒有指定
link_identifier,則使用上一個打開的連接。如果沒有打開的連接,本函數(shù)會嘗試無參數(shù)調(diào)用
mysql_connect()
函數(shù)來建立一個連接并使用之。查詢結(jié)果會被緩存。
在本例中由于沒有指定link_identifier,所以,在執(zhí)行第一條sql時,默認(rèn)使用的是上一個打開的鏈接,即$conn2,而實(shí)際上第一條sql語句應(yīng)該使用的是$conn1,所以導(dǎo)致報(bào)錯,所以為了能夠鏈接多個mysql數(shù)據(jù)庫,可以使用如下方法:
方法1:在mysql_query函數(shù)中指定所用連接,即:
代碼如下:
?php
$conn1
=
mysql_connect("127.0.0.1",
"root","root","db1");
mysql_select_db("Muma",
$conn1);
$conn2
=
mysql_connect("127.0.0.1",
"root","root","db2");
mysql_select_db("product",
$conn2);
$sql
=
"select
*
from
ip";
$query
=
mysql_query($sql,$conn1);
//添加連接$conn1
if($row
=
mysql_fetch_array($query))
echo
$row[0]."n";
$sql
=
"select
*
from
web
";
$query
=
mysql_query($sql,
$conn2);
if($row
=
mysql_fetch_array($query))
echo
$row[0];
?
方法2:在sql語句中關(guān)聯(lián)所用數(shù)據(jù)庫,此時可以省略mysql_query的第二個參數(shù),即:
代碼如下:
?php
$conn1
=
mysql_connect("127.0.0.1",
"root","root","db1");
mysql_select_db("db1",
$conn1);
$conn2
=
mysql_connect("127.0.0.1",
"root","root","db2");
mysql_select_db("db2",
$conn2);
$sql
=
"select
*
from
db1.ip";
//關(guān)聯(lián)數(shù)據(jù)庫
$query
=
mysql_query($sql);
if($row
=
mysql_fetch_array($query))
echo
$row[0]."n";
$sql
=
"select
*
from
db2.web
";
$query
=
mysql_query($sql);
if($row
=
mysql_fetch_array($query))
echo
$row[0];
?
前邊介紹了負(fù)載均衡,mysql同步,接下來介紹tp6分布式部署多個數(shù)據(jù)庫,實(shí)現(xiàn)讀寫分離。
tp6的分布式部署讀和寫仍然是一個系統(tǒng),這里我們分開操作,給用戶展示的就是從數(shù)據(jù)庫,后端添加文章就是主庫,然后同步到從庫。
1、配置數(shù)據(jù)庫鏈接參數(shù)
目標(biāo):實(shí)現(xiàn)隨機(jī)使用數(shù)據(jù)庫展示信息,只是讀操作。
測試:前臺可以讀取表中內(nèi)容(存放的不一致),查看是否是隨機(jī)顯示的。
打開.env文件進(jìn)行編輯
說明:
2、編輯database.php
找到deploy設(shè)置為1分布式部署,下邊不要改,都是讀,寫入的也就是后端的我們單獨(dú)建站連接主庫。
配置完成,tp6使用的是mt_rand取隨機(jī)數(shù)判斷使用哪個數(shù)據(jù)庫。
3、數(shù)據(jù)庫交互寫操作
比如瀏覽量沒必要每次都去更新數(shù)據(jù)庫,可以先使用redis緩存,存夠1000的整數(shù)倍,再去更新數(shù)據(jù)庫。
4、后臺獨(dú)立,也就是寫
可以前后端分離,單獨(dú)做一個網(wǎng)站(沒有前端)使用ip訪問或者獨(dú)立的域名連接后臺。
5、上傳附件(jquery ajax跨域上傳)
使用了nginx負(fù)載均衡,肯定是多個一樣的網(wǎng)站,如果圖片存放到一個站,別的就不能訪問了,可以單獨(dú)設(shè)置一個附件(壓縮包,圖片等)服務(wù)器,可以使用二級域名連接,這就要求我們上傳附件的時候,是上傳到附件服務(wù)器。
jqueryURL
API控制器apdpic方法
說明:
也可以先傳到后臺服務(wù)器然后使用(php)ftp上傳,或者是通過curl上傳到附件服務(wù)器,感覺那樣畢竟麻煩,直接設(shè)置跨域會比較簡單。
也測試了使用jsonp跨域,但是不能上傳附件。
6、thinkphp6實(shí)現(xiàn)讀寫分離(在一個站點(diǎn))
我個人是不喜歡這樣的,負(fù)載均衡應(yīng)該是均衡地讀,也就是前臺單獨(dú)一個站點(diǎn),后端的寫是另一個獨(dú)立的站點(diǎn),看個人喜好吧。
獨(dú)立后臺的優(yōu)點(diǎn):可以提升安全性,因?yàn)槲覀兊暮笈_網(wǎng)址是不公開的,避免用戶猜測一些后臺的信息。
.env配置按照1所述編輯,默認(rèn)第一個是主庫。
database.php
愿大家在新的一年心想事成,萬事如意?。。?/p>
實(shí)例化兩條sql鏈接.例如 $wdb = mysql_connect('localhost','root','123456','a1');//負(fù)責(zé)寫入的數(shù)據(jù)庫$rdb = mysql_connect('192.168.xx.xx','root','123456','a2');//負(fù)責(zé)讀的數(shù)據(jù)庫這樣就可以鏈接兩個數(shù)據(jù)庫了。