php pdo соединение не может быть установлено, но клиент командной строки mysql может

Ситуация следующая:

Сценарий php на сервере a, запускаемый пользователем 'web' (nginx + php-fpm), должен обращаться к mysql на сервере b через библиотеку pdo, но получает SQLSTATE[HY000] [2003] Невозможно подключиться к серверу MySQL в 'xxx.xxx.xxx.xxx' (4)

сервер сентос 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();
}

3 ответа

Решение

Так что получается, что это была проблема маршрутизации в конце концов.

В настоящее время мы используем статически маршрутизируемую сеть, и у сервера mysql a не определен маршрут обратно к серверу b.

настройки сети немного запутаны, так как физическое соединение выглядит следующим образом: сервер b (удаленный сайт) > vpn gw > интернет> контрольная точка fw > маршрутизатор openwrt> сервер a

Очевидно, клиент командной строки mysql более щадящий и в любом случае смог установить это соединение, но библиотека pdo не смогла.

После добавления маршрута библиотека pdo может успешно устанавливать соединения самостоятельно и с тех пор успешно работает.

Итак, проверьте ваши маршруты, даже если кажется, что соединения ping / telnet / mysql работают.

Кстати, будет ли ошибка "Прерванный системный вызов" охватывать этот сценарий?

$ perror 4
OS error code   4:  Interrupted system call

Вы должны просто повторить попытку при получении этой конкретной ошибки.

Это может быть признаком сильно загруженного сервера / сети. В этом случае вы можете попытаться увеличить время ожидания соединения в качестве кратковременного исправления и решить проблемы перегрузки в долгосрочной перспективе.

Просто столкнулся с такой проблемой, хотя она немного отличалась с точки зрения серверов, адресов и т. Д. Важная вещь, которая помогла мне решить эту проблему:

  1. Попробуйте получить доступ к рассматриваемой БД через CLI из того же окна, на котором работает PHP
  2. Попробуйте подключить БД через PHP из другого ящика

Если первый отказывает, а второй работает, возможно, в вашей базе данных есть дополнительная учетная запись пользователя, назначенная хосту, с которого вы подключаетесь.

Проверьте существующих пользователей с

select host, user, password from mysql.user;

Если вы найдете там что-то вроде:

| host           | user           | password
+----------------+----------------+------------------------------------------
| 10.10.10.1     | myuser         | 
| %              | myuser         | *0803B925439C244BA857C3FD07A4F86A556F0925

это означает, что у вас есть дополнительный пользователь, подключенный к хосту PHP, с которого вы подключаетесь. Либо удалите его, либо сделайте правильный пароль привилегиями для этого конкретного хост-пользователя.

Другие вопросы по тегам