使用drupal_http_request()调用API:本地正常服务器却报连接超时(错误码-110)
drupal_http_request() 服务器连接超时(错误码-110)问题 遇到本地运行正常,但部署到服务器后调用API出现Connection timed out(错误码-110)的情况,大概率是服务器环境的网络或配置限制导致的,我给你几个排查和解决的方向:
先确认PHP超时配置是否真的生效
有些服务器(尤其是共享主机)会限制用户修改default_socket_timeout,或者全局配置的超时时间比你设置的120秒更短。你可以在服务器上创建一个phpinfo.php文件,内容如下:<?php phpinfo(); ?>访问这个文件,搜索
default_socket_timeout查看实际生效的值,同时确认allow_url_fopen处于开启状态——drupal_http_request()依赖这个配置才能发起HTTP请求。检查服务器的网络连通性
本地能访问API不代表服务器也能,很可能是服务器的防火墙、安全组或者网络策略阻止了出站请求。你可以在服务器终端执行curl命令测试:curl -v -m 120 https://你的目标API地址观察输出,如果出现连接超时、拒绝连接的提示,说明是网络层面的问题,需要联系服务器管理员开放对应端口(通常是80或443)的出站权限。
直接在
drupal_http_request()调用中指定超时
有时候Drupal全局配置的$conf['http_request_timeout']可能没被正确加载,你可以尝试在调用时直接传入超时参数,优先级会高于全局配置:$request_options = array( 'timeout' => 120, // 直接设置超时时间 ); $result = drupal_http_request('https://你的目标API地址', $request_options);排查PHP扩展和版本问题
老版本的PHP或curl扩展可能存在兼容性问题,导致无法正常建立连接。在服务器终端执行以下命令检查:php -v # 查看PHP版本 php -m | grep curl # 确认curl扩展是否启用如果curl未启用,需要在PHP配置中开启;如果PHP版本过老(比如低于7.0),建议升级到稳定版本,确保支持目标API使用的TLS协议(比如TLS 1.2+)。
尝试替代的HTTP客户端
如果drupal_http_request()始终无法解决问题,可以考虑使用更灵活的HTTP客户端。比如Drupal 8及以上版本自带Guzzle,你可以直接调用:$client = \Drupal::httpClient(); try { $response = $client->request('GET', 'https://你的目标API地址', [ 'timeout' => 120, 'connect_timeout' => 60, // 单独设置连接阶段的超时 ]); $body = $response->getBody()->getContents(); } catch (\GuzzleHttp\Exception\RequestException $e) { // 捕获错误并处理 $error = $e->getMessage(); }或者直接使用原生curl函数,能获取更详细的错误信息,方便排查问题。
内容的提问来源于stack exchange,提问作者Arif




