自从(我相信!)我在本地Mac OS机器上用brew将PHP版本从7.0切换到7.2以来,我在本地主机上安装的Wordpress reporting cURL error 28(timeout)都遇到了麻烦。查看本地站点的任何管理区域或使用WP CLI,WP更新检查和其他cURL调用会导致cURL请求失败:
警告:发生意外错误。WordPress可能有问题。org或此服务器的配置。如果您仍然有问题,请尝试支持论坛。(WordPress无法建立到WordPress.org的安全连接。请与服务器管理员联系。)在/Users/../wp中包含/update。php在线xxx
(xxx行因安装、本地https站点或非本地https站点等而异,但总是归结为一行捕获curl错误)
据我所知,PHP正在使用brew安装的cURL,cURL可以在CLI和PHP中工作,例如,在主题函数中显式运行它。php工作并返回预期结果(更新的JSON):
$ch = curl_init("http://api.wordpress.org/core/version-check/1.7/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
var_dump("exec", curl_exec($ch));
var_dump("error", curl_error($ch));
curl_close($ch);
同样,只需在终端上获取cURL请求也可以:
curl -v http://api.wordpress.org/core/version-check/1.7/
两者都返回相同的JSON。
我试图编辑我的WP/wp-includes/
各种http、request和cURL相关的类来调试正在发生的事情。因为功能。php的cURL可以工作,但WP的内部不能,我假设我的php cURL本身可以工作。
在里面/wp-includes/Requests/Transports/cURL.php
我已经试着评论了很多curl_setopt
调用尽可能接近在我的函数中工作的最小cURL调用。php,但运气不好,而且我也不知道如何查看请求的确切cURL设置。curl_getinfo
显示的大多是空值或默认值,就像我对从未成功的请求所期望的那样。
我试过并检查过的其他事情:
安装健康检查插件以确认:是,REST API失败,连接到Wordpress。org失败,环回请求失败:禁用的插件和;themes,no plugins,fresh WP install,phpinfo()告诉我cURL已启用(v7.64.0)
我重新安装了cURL,openssh,[email protected]多次通过brew重启计算机,重启apache服务器wp.org检查php错误日志,检查WP调试。log,set error\\u reporting to(E\\u ALL):没有任何可疑的cURL调用出现,防火墙被禁用(其他cURL调用也可以工作,所以…)我对这里发生的事情以及为什么WP的cURL请求失败,基本上使我的整个开发环境无用感到非常困惑。
非常非常感谢您提供的任何帮助或建议。
编辑:仅供参考,stackoverflow上也有相同的问题:https://stackoverflow.com/questions/54906545/how-to-set-or-circumvent-curlopt-connecttimeout-in-php-globally
最合适的回答,由SO网友:John B 整理而成
先试试这个:你的问题可能是DNS
In my testing this is a problem with DNS resolving. 在我的情况下,这是因为我在本地网络上运行的DNS过滤器/缓存没有响应请求。在DNS服务器上重新启动服务后,我的请求很快就通过了&;容易地我建议检查您网络上的任何本地DNS服务器。
OP还通过专门将DNS设置更改为Google的DNS提供商来解决问题,但我在其他地方看到,对于某些问题,问题是Google的DNS,因此从Google切换解决了问题。
<小时>
回到您定期安排的答案:如果是CURL\\u CONNECTTIMEOUT问题,那么您可以这样做:
function filter_request_timeout($timeout) {
return 100; // desired time in seconds
}
add_filter(\'http_request_timeout\', \'filter_request_timeout\' );
两者都有
CURLOPT_CONNECTTIMEOUT
和
CURLOPT_TIMEOUT
设置超时时使用相同的值:
https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-http-curl.php#L127然而,如果这是在安装PHP 7.2之后发生的,可能还有另一个原因。您是否也更新了卷曲扩展?我在通过自制的PHP 7.3上也遇到了同样的问题,所以我要看看我能做些什么,而不必在我所有网站的开发版本中添加过滤器
Update: 这个http_request_timeout
过滤器用于默认超时。如果在获取默认值和发送请求之间设置了超时,则需要在http_request_args
过滤器:
function johnbeales_filter_request_args( $args, $url ) {
if(strpos($url, \'wordpress.org\') !== false ) {
$args[\'timeout\'] = 100; // Timeout in seconds
}
return $args;
}
add_filter(\'http_request_args\', \'johnbeales_filter_request_args\', 10, 2);
因为我们无法连接到wordpress。org,我只调整了wordpress请求的超时时间。组织。