PHP и PDO: подключение к MySQL с использованием адреса IPv6

Я хочу подключиться к удаленному экземпляру MySQL (Google Cloud SQL), используя свой IPv6-адрес.

Я использую PHP PDO следующим образом:

$db = new \PDO('mysql:host=<ipv6-address>;port=3306;dbname=<database-name>', '<username>', '<password>' ); 

Но он всегда терпит неудачу со следующим сообщением об исключении:

PDOException: SQLSTATE [HY000] [2002] Нет пути к хосту

С терминала я могу подключиться к экземпляру MySQL без каких-либо проблем, например:

 mysql --host=<ipv6-address> --user=<username> --<password> 

Любая помощь будет действительно оценена.

благодаря

Solutions Collecting From Web of "PHP и PDO: подключение к MySQL с использованием адреса IPv6"

В случае, если кто-то еще сталкивается с одной и той же проблемой, и чтобы сэкономить их 2 часа, переходя через PHP-источник, PDO MySQL IPv6-соединения работают, если вы поместите квадратные скобки вокруг адреса.

См. https://github.com/php/php-src/blob/master/main/streams/xp_socket.c#L568

например

 $pdo = new PDO("mysql:host=[1234:5678::42];port=3306;dbname=foo", ...); 

Чтение этого https://www.saotn.org/php-mysql-and-ipv6-still-slow/ дает следующую идею:

Зная, что, как правило, IPv6 имеет приоритет над IPv4 (который настраивается), пользователи остаются с медленными ответами на веб-сайт и операции с базой данных, только потому, что отказ от подключения к IPv6-адресу в PHP отказался , и соединение было отказано, что делает переход на IPv4 медленным. Требуется секунда mysql.connect_timeout

Примечание: источник кажется достоверным

Кроме того, это хорошо читать: http://dev.mysql.com/worklog/task/?id=798

Поддержка MySQL должна быть добавлена ​​для работы над IPv6
(«Протокол Интернета 6»).
Это означает:
– пользователи могут подключаться к IPv6. это частично проблема с коннектором .
– хранение информации пользовательского адреса, например, в mysql.user, может быть в формате IPv6
– предлагаемые новые типы данных CIDR и INET разрешают формат IPv6, как описано в WL # 2037 «Добавить типы CIDR и INET»,
– функции, подобные inet_ntoa (), нуждаются в пересмотре

Попытайтесь использовать это для вашего PDO conenction и посмотрите, работает ли он.

 $dbh = new PDO('mysql:host=<ipv6-address>;port=<port>;dbname=<dbname>', <dbusername>, <dbpassword>); 

В случае неудачи вы можете лучше использовать try...catch чтобы получить точно на ошибке

 <?php try { $dbh = new PDO('mysql:host=<ipv6-address>;port=<port>;dbname=<dbname>', <dbusername>, <dbpassword>); } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } ?>