【问题标题】:PHP & PDO: Connect to MySQL using IPv6 addressPHP & PDO:使用 IPv6 地址连接到 MySQL
【发布时间】:2023-04-01 14:43:01
【问题描述】:

我想使用其 IPv6 地址连接到远程 MySQL 实例(Google Cloud SQL 实例)。

我正在使用这样的 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>

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 要么你没有 IPv6,要么连接被防火墙。
  • 如果是这样的话,我将无法从命令行连接。
  • @JohannFradj 你解决问题了吗?
  • @JonasGröger 自从我发布这个问题以来,我没有进行任何测试或进展。根据我最后的理解,这是一个 PHP 连接器问题。如果您发现了什么,请不要忘记与我们分享 ;-)

标签: php mysql pdo ipv6


【解决方案1】:

如果其他人遇到同样的问题,并且为了节省他们 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", ...);

【讨论】:

    【解决方案2】:

    阅读此https://www.saotn.org/php-mysql-and-ipv6-still-slow/ 给出以下想法:

    知道通常情况下,IPv6 优先于 IPv4(可配置),因此用户的网站和数据库操作响应缓慢,只是因为 在 PHP 中连接到 IPv6 地址被拒绝,并且连接被拒绝的处理不正确,使得回退到 IPv4 很慢。它需要 mysql.connect_timeout 秒

    注意:消息来源确实可信

    另外,这是一本好书:http://dev.mysql.com/worklog/task/?id=798

    应添加对 MySQL 在 IPv6 上工作的支持
    (“Internet 协议版本 6”)。
    这意味着:
    - 用户可以使用 IPv6 连接。 这部分是连接器问题。
    - 存储用户地址信息,例如在 mysql.user 中,可以是 IPv6 格式
    - 建议的新数据类型 CIDR 和 INET 允许 IPv6 格式,如 WL#2037“添加 CIDR 和 INET 数据类型”中所述
    - 像 inet_ntoa() 这样的函数需要修改

    【讨论】:

    【解决方案3】:

    尝试将它用于您的 PDO 连接,看看它是否有效。

    $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();
    }
    ?>
    

    【讨论】:

    • 抱歉,我看不出你的代码和我的代码有什么区别?而且我已经粘贴了异常错误消息。感谢您的帮助。
    • 您是否尝试过在代码中不使用port 进行连接,以防配置不同的端口来监听数据库连接?
    • 尝试使用本机 mysql 进行连接,看看会发生什么。如果它连接了,那么你应该测试一下你的服务器是否支持或安装了PDO extension
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多