仅本地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 support | enabled |
| cURL Information | 8.5.0 |
| Age | 10 |
| Features | |
| AsynchDNS | Yes |
| CharConv | No |
| Debug | No |
| GSS-Negotiate | No |
| IDN | Yes |
| IPv6 | Yes |
| krb4 | No |
| Largefile | Yes |
| libz | Yes |
| NTLM | Yes |
| NTLMWB | No |
| SPNEGO | Yes |
| SSL | Yes |
| SSPI | No |
| TLS-SRP | Yes |
| HTTP2 | Yes |
| GSSAPI | Yes |
| KERBEROS5 | Yes |
| UNIX_SOCKETS | Yes |
| PSL | No |
| HTTPS_PROXY | Yes |
| MULTI_SSL | Yes |
| BROTLI | Yes |
| Protocols | dict, 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 |
| Host | aarch64-apple-darwin23.0.0 |
| SSL Version | (SecureTransport) OpenSSL/3.2.0 |
| ZLib Version | 1.2.12 |
| libSSH Version | libssh2/1.11.0 |
排查思路建议
打印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解析的选项。模拟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);检查WordPress的HTTP API配置
- 检查
http_request_args过滤器是否被修改,是否强制设置了代理或错误的解析选项 - 检查
wp-config.php中是否错误配置了WP_PROXY_HOST、WP_PROXY_PORT等常量
- 检查
排查Homebrew环境的依赖冲突
- 执行
php -i | grep "curl",查看PHP的Curl扩展加载的libcurl路径,对比CLI Curl的路径是否一致 - 尝试重新编译PHP的Curl扩展,确保链接到Homebrew的libcurl而非系统自带版本
- 执行
测试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
相关产品推荐
相关产品推荐

