我在新加坡和印度的不同地理位置有2台服务器。
我需要从服务器2的php脚本连接服务器1.脚本如下所示:
<?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和第3之间的时间约为2秒,这意味着 mysql_pconnect 需要2秒钟。第3和第4之间的时间(选择查询)非常少。
此外,如果我在server1上运行此脚本将其连接到server1本身,则需要20 ms。
无法弄清楚为什么连接时间过长。我还尝试了一些诸如 skip-name-resolve 和持久连接之类的东西。但是:(
我该怎么调试这个东西?
答案 0 :(得分:2)
从时间上可以看出,打开连接需要1.4689秒,查询需要0.2855秒。如果一次性DNS查找是唯一的问题,那么查询将会快得多:300毫秒是非常长的时间。这意味着问题必定在其他地方。
首次打开连接时,客户端和服务器会进行协商,其中一个问另一个问题,然后多次等待回复。如果网络具有高延迟,则每个问答周期都需要非常少的时间,并且这会增加。您可以使用ping
来衡量两台计算机之间的网络延迟。
这就是为什么你看到本地连接几乎没有延迟(低延迟)以及为什么查询在建立连接后快速运行(无协商)。没有真正的解决办法,只要确保一旦你获得连接就可以充分利用它,并避免建立新的连接,除非绝对必要。
答案 1 :(得分:-1)
首先,尝试使用像这个PHP代码的PDO做同样的事情:
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";
如果执行时间仍然相同,则必须执行缓存系统以减少与数据库的连接数。