php curl vs cli curl,发布xml

时间:2011-07-22 19:12:14

标签: php curl libcurl

感谢答:

有人可以指出:

之间的区别
$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 PHPCLI CURL -> PHP CURL的欺骗,但我希望有更明确的内容。

5 个答案:

答案 0 :(得分:4)

当你使用反引号时,PHP会调用一个shell。这可能很危险,尤其是在命令中包含变量时。如果某人有办法影响$api_root的值,他们就可以调用你系统上的任何命令。

使用API​​更加安全,可能更快,并且curl库被加载到PHP中。

至于为什么它不起作用,似乎其他人已经回答了这个问题:)

答案 1 :(得分:3)

curl_exec默认返回truefalse。您需要指定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);