PHP中的cURL在FILE和RETURN TRANSFER中返回不同的数据

时间:2008-09-19 18:17:02

标签: php curl

我注意到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);

3 个答案:

答案 0 :(得分:1)

事实证明,错误不在于返回的内容,而在于我解析它的方式。 \ r \ n没有按照我预期的方式解析单引号时,切换到双引号解决了我的问题。我不知道这在函数调用中有所不同。

这很好用:$cresult = split("\r\n", $cresult);

这不是:$cresult = split('\r\n', $cresult);

答案 1 :(得分:1)

在大多数脚本语言中(例如在Bash中也是如此),简单的引号用于表示写入时的内容,而双引号则被“分析”(我不认为这是合适的单词,但我可以'找到更好的。)

$str = 'foo';
echo '$str'; // print “$str” to the screen
echo "$str"; // print “foo” to the screen

对于变量和转义字符都是如此。

答案 2 :(得分:0)

我没有尝试重现“bug”(我认为如果它是实际行为我们可以认为这是一个错误),但也许你可以克服它。

PHP Doc说默认comportement是将结果写入文件,默认文件是STDOUT(浏览器的窗口)。你想要的是获得与文件相同的结果,但是在变量中。

您可以使用ob_start();ob_get_clean();来完成此操作。

$ch = curl_init(...);
// ...
ob_start();
curl_exec($ch);
$yourResult = ob_get_clean();
curl_close($ch);

我知道这不是真正干净的方式(如果有的话),但至少它可以正常工作。

(请原谅我,如果我的英语不完美; - )......)