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

仅本地WordPress中Curl DNS解析失败(错误6),外部环境正常

WordPress更新失败(错误6:无法解析主机)排查指南

问题现象

所有开发站点的WordPress核心、插件及主题更新均失败,报错错误6(无法解析主机)。但同一环境下:

  • CLI版本的Curl访问相同URL完全正常
  • WordPress外部的独立PHP Curl脚本访问相同URL也无异常

已尝试的无效操作

  • 重装Curl和httpd服务
  • 切换PHP版本(覆盖8.2、8.1、7.4)
  • 测试全新WordPress安装及多个现有站点
  • 通过mu-plugin修改Curl选项(如强制IPv4解析),也尝试直接修改WordPress核心文件中的Curl配置

以上操作均未解决问题。

核心怀疑点

无法确认WordPress调用curl_exec()时的完整CURLOPT参数配置,怀疑是WordPress内部的某个Curl选项导致DNS解析失败,希望能在WordPress外复现该问题。

用于修改Curl选项的mu-plugin示例

<?php
add_action( 'http_api_curl', function( $curl_handle ) {
   curl_setopt( $curl_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
});

环境信息

  • macOS Sonoma 14.2.1(问题始于Ventura系统)
  • M1 Max芯片
  • WordPress版本:6.4.2(6.3、5.9.8版本同样存在问题)

CLI Curl信息

> which curl
curl: aliased to /opt/homebrew/opt/curl/bin/curl
> curl -V
curl 8.5.0 (aarch64-apple-darwin23.0.0) libcurl/8.5.0 (SecureTransport) OpenSSL/3.2.0 zlib/1.2.12 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.4 libssh2/1.11.0 nghttp2/1.58.0 librtmp/2.3 OpenLDAP/2.6.6
Release-Date: 2023-12-06
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz MultiSSL NTLM SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd

PHP Curl信息(以8.1.27为例)

> php -i | grep "SSL Version"
SSL Version => (SecureTransport) OpenSSL/3.2.0
Curl详情
cURL supportenabled
cURL Information8.5.0
Age10
Features
AsynchDNSYes
CharConvNo
DebugNo
GSS-NegotiateNo
IDNYes
IPv6Yes
krb4No
LargefileYes
libzYes
NTLMYes
NTLMWBNo
SPNEGOYes
SSLYes
SSPINo
TLS-SRPYes
HTTP2Yes
GSSAPIYes
KERBEROS5Yes
UNIX_SOCKETSYes
PSLNo
HTTPS_PROXYYes
MULTI_SSLYes
BROTLIYes
Protocolsdict, file, ftp, ftps, gopher, gophers, http, https, imap, imaps, ldap, ldaps, mqtt, pop3, pop3s, rtmp, rtmpe, rtmps, rtmpt, rtmpte, rtmpts, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp
Hostaarch64-apple-darwin23.0.0
SSL Version(SecureTransport) OpenSSL/3.2.0
ZLib Version1.2.12
libSSH Versionlibssh2/1.11.0

排查思路建议

  1. 打印WordPress的Curl完整配置
    在mu-plugin中添加代码,输出所有CURLOPT参数,对比CLI和WordPress调用的差异:

    <?php
    add_action( 'http_api_curl', function( $curl_handle ) {
        $options = curl_getinfo($curl_handle);
        error_log(print_r($options, true));
        // 测试环境可直接输出到页面
        var_dump($options);
    });
    

    重点关注CURLOPT_DNS_SERVER、CURLOPT_RESOLVE、CURLOPT_PROXY、CURLOPT_NOSIGNAL等可能影响DNS解析的选项。

  2. 模拟WordPress的HTTP请求环境
    写一个独立PHP脚本,完全复制WordPress的HTTP请求流程,包括用户代理、请求头、Curl选项等,尝试复现错误:

    <?php
    $ch = curl_init('https://api.wordpress.org/core/version-check/1.7/');
    // 复制WordPress默认的Curl选项
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'WordPress/6.4.2; http://your-local-site.dev');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    // 可添加你怀疑的选项进行测试
    // curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    
    $response = curl_exec($ch);
    if($response === false) {
        echo 'Curl错误: ' . curl_error($ch) . ' (错误码: ' . curl_errno($ch) . ')';
    } else {
        echo '请求成功';
    }
    curl_close($ch);
    
  3. 检查WordPress的HTTP API配置

    • 检查http_request_args过滤器是否被修改,是否强制设置了代理或错误的解析选项
    • 检查wp-config.php中是否错误配置了WP_PROXY_HOST、WP_PROXY_PORT等常量
  4. 排查Homebrew环境的依赖冲突

    • 执行php -i | grep "curl",查看PHP的Curl扩展加载的libcurl路径,对比CLI Curl的路径是否一致
    • 尝试重新编译PHP的Curl扩展,确保链接到Homebrew的libcurl而非系统自带版本
  5. 测试DNS解析的差异
    在WordPress中添加代码,直接调用gethostbyname()解析WordPress更新服务器域名,看是否能正常获取IP:

    <?php
    $ip = gethostbyname('api.wordpress.org');
    error_log('api.wordpress.org IP: ' . $ip);
    

    如果解析失败,说明问题可能出在PHP的DNS配置而非Curl本身,可检查/etc/resolv.conf或PHP的dns_get_record()函数返回结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:35:19