You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP周期性连接MySQL失败:php_network_getaddresses解析错误排查

解决方案

针对Docker容器内PHP偶尔无法解析db.domain.com DNS的问题,结合你的测试结果(主机/Node.js无问题、IP连接正常),可以尝试以下几个针对性方案:

1. 替换Docker容器的DNS服务器

默认Docker容器可能使用的DNS服务器稳定性不足,导致与Cloudflare DNS交互时出现解析波动。直接指定公共DNS服务器:

  • 单容器运行时添加参数:
    docker run --dns=1.1.1.1 --dns=1.0.0.1 [你的容器镜像]
    
  • 使用docker-compose时,在配置文件中添加:
    services:
      web-service:
        # 其他配置项
        dns:
          - 1.1.1.1
          - 1.0.0.1
    

2. 容器内添加本地hosts映射

跳过DNS查询,直接在容器内绑定域名与主机IP,彻底解决解析问题:

  • 单容器运行时添加参数:
    docker run --add-host=db.domain.com:你的主机实际IP [你的容器镜像]
    
  • docker-compose配置:
    services:
      web-service:
        # 其他配置项
        extra_hosts:
          - "db.domain.com:192.168.1.10" # 替换为你的主机IP
    

注意:若主机IP变动,需同步更新此配置,但能保留域名连接的速度优势。

3. 启用PHP mysqlnd扩展的DNS缓存

PHP的mysqli扩展默认可能未启用DNS缓存,导致每次连接都重新解析。开启mysqlnd的DNS缓存功能:
在PHP配置文件(php.ini)中添加或修改:

mysqlnd.dns_cache = On

重启PHP-FPM或容器使配置生效。

4. 调整Docker DNS解析重试策略

修改Docker daemon的DNS超时与重试次数,提升解析成功率:

  1. 编辑/etc/docker/daemon.json(若不存在则创建):
    {
      "dns-opts": ["timeout:2", "attempts:3"]
    }
    
  2. 重启Docker服务:
    systemctl restart docker
    

5. 检查Cloudflare DNS记录配置

确保db.domain.com未开启Cloudflare代理(橙色云):

  • 登录Cloudflare后台,找到该域名的A记录,将云朵图标切换为灰色(仅DNS解析)。数据库连接无需经过Cloudflare代理,开启代理可能导致解析或连接波动。

内容的提问来源于stack exchange,提问作者MJDawson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:57:40