Centos

php pdo連接無法建立,但是mysql命令行客戶端可以

  • April 2, 2018

情況如下:

伺服器 a 上的 php 腳本,由使用者 ‘web’ (nginx + php-fpm) 執行,應該通過 pdo 庫訪問伺服器 b 上的 mysql,但獲取 SQLSTATE

$$ HY000 $$ $$ 2003 $$無法連接到“xxx.xxx.xxx.xxx”上的 MySQL 伺服器 (4) 伺服器一個centos 6.5,php 5.3;伺服器 b centos 6.2,mysql 5.1

但是,mysql 命令行客戶端 - 以非特權使用者身份執行 - 可以完美連接,可重現且穩定。

一旦mysql命令行客戶端在伺服器之間建立成功連接,php腳本也會成功執行大約5-7分鐘,大概直到mysql命令行客戶端連接超時。

我錯過了什麼?

這是測試腳本:

  <?php
  try {
  $dbh = new PDO('mysql:host=111.111.111.111;dbname=myname;port=3306', 'myuser',
   'mypass');
 echo 'Connected to database';
}
catch(PDOException $e)
{
echo $e->getMessage();
}

所以事實證明這畢竟是一個路由問題。

我們目前使用的是靜態路由網路,mysql 伺服器 a 沒有定義返回伺服器 b 的路由。

網路設置有點混亂,因為物理連接是這樣的:伺服器 b(異地)> vpn gw > 網際網路 > 檢查點 fw > openwrt 路由器 > 伺服器 a

顯然 mysql 命令行客戶端更寬容,無論如何都能夠建立該連接,但 pdo 庫不能。

添加路由後,pdo 庫可以自行成功建立連接,並在之後愉快地執行。

因此,請檢查您的路由,即使 ping/telnet/mysql 連接看似正常。

順便說一句,錯誤“中斷的系統呼叫”會涵蓋這種情況嗎?

引用自:https://serverfault.com/questions/609631