PHP调用curl获取Jira数据失败,系统可执行但PHP报错求助
问题原因
你的代码报错是因为Windows命令行中&是命令分隔符,拼接的URL里包含&applicationType=stash&dataType=repository,shell_exec执行curl命令时,&会被解析为结束当前curl命令,把后面的applicationType=stash和dataType=repository当成独立命令执行,所以出现“未被识别为命令”的错误。同时curl没有正确获取到数据,返回null,触发json_decode的废弃警告。
解决方案
方案1:修复shell_exec的命令格式
把URL用转义的双引号包裹,让Windows命令行把整个URL当成一个参数:
<?php function getJsonFromUrl($urlString) { // 用双引号包裹URL,转义内部双引号避免解析错误 $urlData = shell_exec("curl --silent --request GET --url \"{$urlString}\" --user 'root:password' --header 'Accept: application/json'"); $jsonData = json_decode($urlData, true); return $jsonData; } $data = array( 'id' => '', 'parent' => '', 'issueId' => '1931461', 'issueType' => '' ); $url = "https://jira.myorg.com/rest/dev-status/1.0/issue/detail?issueId={$data['issueId']}&applicationType=stash&dataType=repository"; $jsonData = getJsonFromUrl($url); ?>
方案2:使用PHP原生CURL扩展(推荐)
直接用PHP的curl扩展替代shell_exec,既避免命令行字符解析问题,也更安全(防止命令注入风险):
<?php function getJsonFromUrl($urlString) { $ch = curl_init($urlString); // 设置curl选项 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将结果返回而不是直接输出 curl_setopt($ch, CURLOPT_USERPWD, 'root:password'); // 基础认证信息 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Accept: application/json' ]); // 若Jira的SSL证书未被系统信任,可临时关闭验证(生产环境建议配置信任证书) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $urlData = curl_exec($ch); $error = curl_error($ch); curl_close($ch); // 处理curl请求错误 if ($error) { error_log("CURL错误: {$error}"); return null; } $jsonData = json_decode($urlData, true); return $jsonData; } $data = array( 'id' => '', 'parent' => '', 'issueId' => '1931461', 'issueType' => '' ); $url = "https://jira.myorg.com/rest/dev-status/1.0/issue/detail?issueId={$data['issueId']}&applicationType=stash&dataType=repository"; $jsonData = getJsonFromUrl($url); ?>
内容的提问来源于stack exchange,提问作者R_SS
相关产品推荐
相关产品推荐

