PHP Curl脚本在命令行正常运行但通过Web服务器(PHP-FPM)访问时无数据返回的问题求助
PHP Curl脚本在命令行正常运行但通过Web服务器(PHP-FPM)访问时无数据返回的问题求助
我遇到了一个非常棘手的问题:我编写的PHP Curl脚本在命令行执行时完全正常,能成功获取JSON格式的数据并解析输出,但将其放到Web服务器文档根目录后,无论是通过浏览器直接访问,还是通过局域网内其他机器的脚本调用,curl_exec()都返回空数据,获取到的内容长度为0,还会触发数组偏移访问的警告。
脚本内容
先给大家看一下我的核心脚本test.php:
#!/usr/bin/php <?php $url = "https://host.ext"; $user = "<user>"; $pass = "<pw>"; $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLOPT_USERPWD, $user.":".$pass); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); //curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json')); $result = curl_exec($curl); $resultlen = strlen($result); curl_close($curl); $r_ary = array(); $r_ary = json_decode( $result , true , 512 , JSON_OBJECT_AS_ARRAY ); $st = 'status'; $status = $r_ary[$st]; echo "<!doctype html>"; echo "<html>"; echo "<body>"; echo "Length: $resultlen"; echo "Status: $status"; echo "</body>"; echo "</html>"; ?>
命令行执行正常情况
在命令行下运行该脚本(替换真实的账号密码后),能成功获取913字节的数据,输出如下:
[root@box local]# ./test.php <!doctype html><html><body>Length: 913Status: active</body></html> [root@box local]#
Web服务器/跨LAN调用的异常情况
当我去掉脚本开头的#!行,将其放到Web服务器的文档根目录后,问题就出现了:
- 直接用浏览器访问,页面显示
Length: 0Status: - 通过局域网内另一台机器(box2)的脚本调用,同样返回空数据。调用脚本
call.php内容如下:
#!/usr/bin/php <?php $webPage = "http://box/test.php"; date_default_timezone_set("America/New_York"); $fd = fopen($webPage, "r"); $r = file_get_contents( $webPage ); print "Retrieved: $r \n"; fclose($fd); ?>
执行后输出:
[root@box2 work23]$ ./call.php Retrieved: <!doctype html><html><body>Length: 0Status: </body></html> [root@box2 work23]$
已尝试的排查操作
- 我尝试过注释/取消注释
CURLOPT_RETURNTRANSFER和HTTPHEADER相关的配置项,但Web服务器环境下的脚本完全没有变化;不过命令行版本必须开启CURLOPT_RETURNTRANSFER才能正常工作。
系统环境信息
- 操作系统:CentOS Stream 9(在同版本的AlmaLinux上也遇到了相同问题)
- Web服务器:Apache 2.4.57
- PHP环境:PHP-FPM(未使用mod_php),PHP版本8.0.30
- 安装方式:通过dnf包管理器安装httpd、php、php-fpm及相关依赖
日志排查情况
查看/var/log/php-fpm下的日志,没有发现curl相关的错误信息,只有因为空数据导致的数组偏移警告:
[root@box php-fpm]# tail -3 www-error.log [05-Jan-2024 22:05:12 UTC] PHP Warning: Trying to access array offset on value of type null in /var/www/html/test.php on line 25 [05-Jan-2024 22:08:57 UTC] PHP Warning: Trying to access array offset on value of type null in /var/www/html/test.php on line 25 [05-Jan-2024 22:08:57 UTC] PHP Warning: Trying to access array offset on value of type null in /var/www/html/test.php on line 25
PHP-FPM的主错误日志里只有服务启动、停止的通知,没有异常报错。
其他配置检查
我检查了/etc/php-fpm.conf和/etc/php-fpm.d/www.conf,里面没有任何与curl相关的配置;系统只有一个php.ini文件位于/etc目录下。目前我在考虑是否要尝试从PHP-FPM切换到mod_php,但不确定当前系统版本是否还支持mod_php。
有没有大佬遇到过类似的问题并解决了?麻烦给点排查思路或者解决方案,非常感谢!
备注:内容来源于stack exchange,提问作者Clovis_Sangrail
相关产品推荐
相关产品推荐

