CentOS 7下PHP5 CLI结合Curl调用REST API遇Content-Length异常
排查GLPI REST API Curl请求异常的方案
先把你提供的请求输出整理出来,方便后续分析:
[+] API GLPI : Session Initializing User Token ===> YsYJnd81WFiFIJ0pqdW6GqiujUpfkH12tdlgYElj Init Url ===> http://192.168.158.129:8080/apirest.php/initSession/ * About to connect() to 192.168.158.129 port 8080 (#0) * Trying 192.168.158.129... * Connected to 192.168.158.129 (192.168.158.1...
从输出能看出来,Curl已经成功和服务器建立了TCP连接,但请求没继续往下走,下面给你几个针对性的排查方向:
1. 补全PHP Curl的请求配置,获取完整调试信息
PHP5的Curl模块发送JSON POST请求时,很容易因为头信息或数据格式缺失导致请求中断。你可以给脚本加上这些配置,拿到更详细的错误日志:
$url = 'http://192.168.158.129:8080/apirest.php/initSession/'; $token = 'YsYJnd81WFiFIJ0pqdW6GqiujUpfkH12tdlgYElj'; $ch = curl_init($url); // 必须设置JSON请求头和令牌授权头 curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: user_token ' . $token )); // 开启POST请求,确保数据是合法JSON格式 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([])); // 这里如果需要传参,替换成对应数组 // 强制返回结果到变量,不直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 开启详细调试模式 curl_setopt($ch, CURLOPT_VERBOSE, true); // 把调试日志写入临时流 $verboseLog = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verboseLog); $response = curl_exec($ch); // 输出调试日志 rewind($verboseLog); echo "详细调试日志:\n" . stream_get_contents($verboseLog); // 检查Curl是否抛出错误 if(curl_errno($ch)) { echo "\nCurl错误: " . curl_error($ch); } curl_close($ch);
运行这个脚本后,就能看到请求中断的具体原因,比如是服务器返回了错误码,还是请求格式不被接受。
2. 验证GLPI服务器的API状态和权限
- 先直接访问
http://192.168.158.129:8080/apirest.php,如果能返回GLPI API的基础信息(比如版本号),说明API入口是正常的; - 检查你的用户令牌是否有效:登录GLPI后台,找到对应用户的API令牌,确认没有过期或被禁用;
- 查看GLPI的日志文件(一般在
glpi/files/_log/目录下),里面会记录API请求的错误详情,比如权限不足、令牌无效等。
3. 用系统Curl命令直接测试,排除PHP脚本问题
在CentOS7的命令行里直接执行下面的命令,看能不能成功获取会话:
curl -X POST -H "Content-Type: application/json" -H "Authorization: user_token YsYJnd81WFiFIJ0pqdW6GqiujUpfkH12tdlgYElj" http://192.168.158.129:8080/apirest.php/initSession/
如果命令行能成功返回会话数据,那问题肯定出在PHP脚本的Curl配置上;如果命令行也失败,那就要排查网络连通性(比如防火墙是否拦截8080端口)或者GLPI的API配置。
4. 检查PHP5的Curl扩展状态
- 执行
php -m | grep curl,确认Curl扩展已经启用; - 查看
php.ini文件,确保没有禁用Curl的相关功能(比如curl.cainfo,不过你用的是HTTP,这个暂时可以忽略)。
内容的提问来源于stack exchange,提问作者S. Di Cioccio
相关产品推荐
相关产品推荐

