2013-07-16 127 views
0

我有2臺服務器在不同的地理位置新加坡和印度。PHP遠程MySQL數據庫連接很慢SLOW

我需要服務器1從PHP腳本在服務器連接2.劇本是這樣的:

<?php 

echo microtime(true)."\n"; 
$con = mysql_pconnect('server1','username','password'); 

$db = mysql_select_db('database_name',$con);      

echo microtime(true)."\n"; 

$q = "select * from tablename where id='35'"; 
$result = mysql_query($q); 

echo microtime(true)."\n"; 

?> 

該出把這個腳本是這樣的:

1373977322.9081 
1373977324.377 
1373977324.6625 

,你可以看到第二次和第三次之間的時間大約是2秒,這意味着mysql_pconnect正在持續2秒鐘。第三和第四(選擇查詢)之間的時間非常少。

此外,如果我運行這個腳本server1連接到server1本身它需要20毫秒。

無法弄清楚爲什麼連接時間太長。我也嘗試了一些東西,如skip-name-resolve和持久連接。但:(

如何調試這個東西???

+3

在服務器之間使用'traceroute'來查看瓶頸在哪裏。 – Barmar

+1

嘗試與[mysqli]一樣(http://php.net/manual/en/book.mysqli.php) – yoavmatchulsky

+0

如果您在server1上運行腳本,連接到它自身,當然它將在20ms內運行。你正在使用本地主機 - 數據沒有距離去旅行。 – crush

回答

2

正如你所看到的那樣,打開一個連接需要1.4689秒,而查詢需要0.2855秒如果一次性DNS查詢是查詢速度快得多的唯一問題:300米s是一個很長的時間。這意味着問題必須在其他地方。

當第一次打開連接時,客戶端和服務器經過一次協商,其中一個人詢問另一個問題,然後等待多次回覆。如果網絡的延遲時間很長,那麼每個問題 - 回答週期都會花費不少的時間,而且這會增加。您可以使用ping來測量兩臺機器之間的網絡延遲。

這就是爲什麼您看到本地連接(低延遲)實際上沒有延遲,並且爲什麼連接建立後(無需協商)查詢運行得很快。沒有真正的解決辦法,只要確保一旦獲得連接,就可以充分利用它,避免建立新的連接,除非絕對必要。

+0

是的你是對的,沒有真正的解決方案。嘗試了一些減少連接時間的東西。一個是使用IP地址而不是主機名,這減少了100ms的連接時間。也使用上面給出的解決方案,使用mysqli這也縮短了一些時間。現在連接時間縮短到400ms或800ms左右。 –

+0

對於DNS查詢來說,100ms聽起來很長時間;網絡配置或硬件可能有問題。與本地網絡中主機的連接是否同樣緩慢? – Joni

-1

首先,嘗試做同樣的事情與PDO類似這樣的PHP代碼:

echo microtime(true)."\n"; 
$con = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');  
echo microtime(true)."\n";  
$q = $con->query("select * from tablename where id='35'");  
echo microtime(true)."\n"; 

如果執行時間仍然是相同的,你將不得不做一個緩存系統來減少連接到數據庫的數量

+0

連接數與慢速連接有關。另外,我怎樣才能使用緩存系統。我們可以緩存數據庫連接嗎? –

+3

是什麼讓你覺得另一個使用** C++ API函數**的驅動會花費不同的時間? –