Я хочу подключиться к удаленному экземпляру 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>
Любая помощь будет действительно оценена.
благодаря
В случае, если кто-то еще сталкивается с одной и той же проблемой, и чтобы сэкономить их 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(); } ?>