ситуация следующим образом:
сценарий PHP на сервере a, выполненный пользователем 'сеть' (nginx + php-fpm) должен получить доступ к mysql на сервере b через pdo библиотеку, но добирается, SQLSTATE[HY000] [2003] не Может соединиться с сервером MySQL на 'xxx.xxx.xxx.xxx' (4)
сервер песни 6.5, php 5.3; сервер b песни 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 (off-site) > vpn gw > internet > checkpoint fw > openwrt router > server a
Видимо, клиент командной строки mysql более снисходителен и все равно смог установить такое соединение, но библиотека pdo не была установлена.
После добавления маршрута pdo-библиотека могла успешно устанавливать соединения самостоятельно и с тех пор успешно работает.
Итак, проверьте свои маршруты, даже если соединения ping/telnet/mysql, кажется, работают.
Кстати, покроет ли ошибка "Прерванный системный вызов" этот сценарий?
.$ perror 4
OS error code 4: Interrupted system call
При получении этой конкретной ошибки следует просто повторить попытку.
Это может быть признаком сильно загруженного сервера/сети . В этом случае можно попробовать увеличить таймаут соединения в качестве кратковременного исправления и решить проблемы перегрузки на длительный срок.
.Просто столкнулся с подобной проблемой, хотя она немного отличалась с точки зрения серверов, адресов и т. Д. Важная вещь, которая помогла мне решить эту проблему:
Если первый не работает, а второй работает, возможно, у вас есть дополнительный пользователь учетная запись в вашей БД, назначенная хосту, с которого вы подключаетесь.
Проверьте существующих пользователей с помощью
select host, user, password from mysql.user;
. Если вы найдете там что-то вроде:
| host | user | password
+----------------+----------------+------------------------------------------
| 10.10.10.1 | myuser |
| % | myuser | *0803B925439C244BA857C3FD07A4F86A556F0925
, это означает, что у вас есть этот дополнительный пользователь, подключенный к хосту PHP, с которым вы подключение из. Либо отбросьте его, либо сделайте правильный пароль привилегиями для этого пользователя, зависящего от хоста.