cURL в PHP возвращает разные данные в _FILE и _RETURNTRANSFER
Вопрос
Я заметил, что 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);
Я знаю, что на самом деле это не самый чистый способ (если он есть), но, по крайней мере, он должен работать нормально.
(Пожалуйста, извините меня, если мой английский не идеален ;-) ...)