PHP中的cURL在_FILE和_RETURNTRANSFER中返回不同的数据
我已经注意到,PHP告诉cURL通过CURLOPT_FILE
输出到文件时,会返回不同的数据,就像它告诉CURLOPT_RETURNTRANSFER
将输出发送到字符串时一样。
_RETURNTRANSFER似乎会删除换行符和多余的空格,就像将其解析为显示为标准HTML代码一样。另一方面," _ FILE"会完全按预期保留文件。
我已经阅读了php.net上的文档,但没有发现任何似乎可以解决我的问题的东西。理想情况下,我希望_RETURNTRANSFER
返回准确的内容,这样我就可以消除中间文件,但是我看不出有什么办法可以做到这一点。
这是我正在使用的代码。有问题的数据是带有\ r \ n行尾的CSV文件。
function update_roster() { $url = "http://example.com/"; $userID = "xx"; $apikey = "xxx"; $passfields = "userID=$userID&apikey=$apikey"; $file = fopen("roster.csv","w+"); $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_POSTFIELDS, $passfields); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FILE, $file); $variable_in_question = curl_exec ($ch); curl_close ($ch); fclose($file); return $variable_in_question; }
事实证明,错误不在于返回的内容,而在于我解析它的方式。 \ r \ n没有以单引号引起的预期解析,切换到双引号解决了我的问题。我不知道这在像这样的函数调用中产生了不同。
这很好用:$ cresult = split(" \ r \ n",$ cresult);
这不是:$ cresult = split('\ r \ n',$ cresult);
解决方案
我没有尝试重现"错误"(我想我们可以将其视为错误,如果它是实际行为),但是也许我们可以克服它。
PHP Doc表示默认的组合是将结果写入文件,默认文件是STDOUT(浏览器的窗口)。我们想要获得的结果与在文件中但在变量中得到的结果相同。
我们可以使用" ob_start();"和" ob_get_clean();"来实现。
$ch = curl_init(...); // ... ob_start(); curl_exec($ch); $yourResult = ob_get_clean(); curl_close($ch);
我知道这并不是真正的干净方法(如果有的话),但至少它可以正常工作。
(如果我的英语不完美,请原谅;-)...)
事实证明,错误不在于返回的内容,而在于我要解析的方式。 \ r \ n没有以单引号引起的预期解析,切换到双引号解决了我的问题。我不知道这在像这样的函数调用中产生了不同。
这很好用:$ cresult = split(" \ r \ n",$ cresult);
这不是:$ cresult = split('\ r \ n',$ cresult);
在大多数脚本语言中(例如,在Bash中也是如此),简单的引号用于表示所编写的内容,而双引号则被"分析"(我认为这不是合适的词,但我找不到更好的词了) )。
$str = 'foo'; echo '$str'; // print “$str” to the screen echo "$str"; // print “foo” to the screen
对于变量和转义字符是正确的。