cURL в PHP возвращает разные данные в _FILE и _RETURNTRANSFER

StackOverflow https://stackoverflow.com/questions/104223

  •  01-07-2019
  •  | 
  •  

Вопрос

Я заметил, что cURL в PHP возвращает разные данные, когда им говорят вывести в файл через CURLOPT_FILE как это происходит, когда говорят отправить выходные данные в строку через CURLOPT_RETURNTRANSFER.

_RETURNTRANSFER кажется, что он удаляет новые строки и лишние пробелы, как будто разбирает их для отображения в виде стандартного HTML-кода. _FILE с другой стороны, файл сохраняется именно в том виде, в каком он был задуман.

Я прочитал документацию по php.net, но не нашел ничего, что могло бы решить мою проблему.В идеале я хотел бы иметь _RETURNTRANSFER верните точное содержимое, чтобы я мог исключить промежуточный файл, но я не вижу никакого способа сделать это возможным.

Вот код, который я использую.Данные, о которых идет речь, представляют собой 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);

Это было полезно?

Решение

Оказывается, ошибка заключается не в том, что было возвращено, а в том, как я собирался это проанализировать.\ 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

Это верно для переменных и экранированных символов.

Я не пытался воспроизвести "ошибку" (я думаю, мы можем рассматривать это как ошибку, если это реальное поведение), но, возможно, вы могли бы справиться с этим.

В документе PHP говорится, что по умолчанию выполняется запись результата в файл, и что файлом по умолчанию является СТАНДАРТНЫЙ вывод (окно браузера).Что вы хотите, так это получить тот же результат, что и в файле, но в переменной.

Вы могли бы сделать это, используя ob_start(); и ob_get_clean();.

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

Я знаю, что на самом деле это не самый чистый способ (если он есть), но, по крайней мере, он должен работать нормально.

(Пожалуйста, извините меня, если мой английский не идеален ;-) ...)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top