感谢答:
有人可以指出:
之间的区别$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_root);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "xml"); // tried http_build_query also
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Added this, still no good
return curl_exec($ch); // returns false
和
$curl = "curl -X POST -d 'xml' {$api_root}";
return `$curl`; // returns expected xml from server
并/或者
更一般地说,php的libcurl默认值/标题与命令行中的curl之间的转换/引用是否有任何良好的细分?
我知道这几乎是curl CLI to curl PHP和CLI CURL -> PHP CURL的欺骗,但我希望有更明确的内容。
答案 0 :(得分:4)
当你使用反引号时,PHP会调用一个shell。这可能很危险,尤其是在命令中包含变量时。如果某人有办法影响$api_root
的值,他们就可以调用你系统上的任何命令。
使用API更加安全,可能更快,并且curl库被加载到PHP中。
至于为什么它不起作用,似乎其他人已经回答了这个问题:)
答案 1 :(得分:3)
curl_exec默认返回true
或false
。您需要指定CURLOPT_RETURNTRANSFER:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
由于curl_exec正在返回false
(原始问题中未显示为NULL),请尝试使用curl_error()确定为什么它正在返回{ {1}}。
TFM(读它):curl_exec(),curl_setopt()
为后人编辑:
OP发现SSL问题是障碍。 libcurl(通过PHP调用)和false
命令行都为每个事务执行SSL对等验证,除非用户明确禁用它。
可能的情况是shell环境使用的是与PHP的libcurl实现不同的CA包。要解决此问题,请将CURLOPT_CAINFO设置为与shell的CURL_CA_BUNDLE环境变量相同,然后对等验证应该有效。
@OP:我很想知道上述建议是否在您的情况下得到确认,或者SSL配置是否存在其他不同之处。
答案 2 :(得分:2)
在你的php例子中你缺少了 curl_setopt($ ch,CURLOPT_RETURNTRANSFER,1);
来自php手册: curl_exec 成功时返回TRUE,失败时返回FALSE。但是,如果设置了CURLOPT_RETURNTRANSFER选项,它将在成功时返回结果,在失败时返回FALSE。
答案 3 :(得分:2)
添加以下行:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
答案 4 :(得分:0)
匹配CLI版本:
$curl = "curl -X POST -d 'xml' {$api_root}";
return `$curl`; // returns expected xml from server
我还需要:
// Thanks to all the answers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// This appears to default false on CLI, true in libcurl
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);