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
Вы должны просто повторить попытку при получении этой конкретной ошибки.
Это может быть признаком сильно загруженного сервера / сети. В этом случае вы можете попытаться увеличить время ожидания соединения в качестве кратковременного исправления и решить проблемы перегрузки в долгосрочной перспективе.
Просто столкнулся с такой проблемой, хотя она немного отличалась с точки зрения серверов, адресов и т. Д. Важная вещь, которая помогла мне решить эту проблему:
- Попробуйте получить доступ к рассматриваемой БД через CLI из того же окна, на котором работает PHP
- Попробуйте подключить БД через PHP из другого ящика
Если первый отказывает, а второй работает, возможно, в вашей базе данных есть дополнительная учетная запись пользователя, назначенная хосту, с которого вы подключаетесь.
Проверьте существующих пользователей с
select host, user, password from mysql.user;
Если вы найдете там что-то вроде:
| host | user | password
+----------------+----------------+------------------------------------------
| 10.10.10.1 | myuser |
| % | myuser | *0803B925439C244BA857C3FD07A4F86A556F0925
это означает, что у вас есть дополнительный пользователь, подключенный к хосту PHP, с которого вы подключаетесь. Либо удалите его, либо сделайте правильный пароль привилегиями для этого конкретного хост-пользователя.