CentOS Stream 9下PHP cURL请求失败但终端curl正常求助
问题:PHP cURL无法连接服务器,但终端curl正常工作
我有一台运行CentOS Stream 9的服务器,搭载Apache 2.4.57和PHP 8.2.6。已通过phpinfo()确认cURL 7.76.1已启用,但使用PHP发起cURL请求时返回空内容并抛出错误,而在终端执行相同curl请求却能正常获取内容。
test.php文件内容:
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://catfact.ninja/fact"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); if ($errno = curl_errno($ch)) { $error_message = curl_strerror($errno); echo "cURL error ({$errno}): {$error_message}"; } curl_close($ch); echo $result;
PHP执行输出:
cURL error (7): Couldn't connect to server
终端执行命令:
[user@server ~]$ curl https://catfact.ninja/fact
终端执行输出:
{"fact":"The average litter of kittens is between 2 - 6 kittens.","length":55}
排查与解决步骤
1. 检查SELinux权限限制
CentOS Stream 9默认启用SELinux,可能禁止Apache(httpd进程)发起网络请求。先临时关闭SELinux测试:
setenforce 0
如果测试后PHP cURL恢复正常,执行以下命令永久允许Apache网络连接:
setsebool -P httpd_can_network_connect on
2. 统一CA证书配置
终端curl和PHP的curl可能使用不同的CA证书:
- 在
phpinfo()中查看curl.cainfo项,确认是否配置了正确的CA证书路径 - 若未配置,在
php.ini中添加系统默认CA证书路径:
修改后重启Apache:curl.cainfo = /etc/pki/tls/certs/ca-bundle.crt openssl.cafile = /etc/pki/tls/certs/ca-bundle.crtsystemctl restart httpd
3. 查看Apache错误日志获取细节
执行命令查看Apache错误日志,获取连接失败的具体原因:
tail -f /var/log/httpd/error_log
日志可能会显示DNS解析失败、端口拦截等关键信息。
4. 测试PHP环境的DNS解析能力
在测试代码中添加DNS解析测试,确认PHP能否正确解析目标域名:
var_dump(gethostbyname("catfact.ninja"));
如果返回false或错误IP,检查/etc/resolv.conf的DNS服务器配置,确保Apache进程有权限读取该文件。
5. 验证防火墙出站规则
确认firewalld是否允许HTTPS(443端口)出站请求:
firewall-cmd --list-all
若缺少相关规则,执行以下命令添加并重启防火墙:
firewall-cmd --permanent --add-service=https firewall-cmd --reload
内容的提问来源于stack exchange,提问作者amazedinc
相关产品推荐
相关产品推荐

