cURL em PHP retorna dados diferentes em _FILE e _RETURNTRANSFER
Pergunta
Tenho notado que cURL em PHP retorna dados diferentes quando disse para saída para um arquivo via CURLOPT_FILE
como faz quando disse para enviar a saída para uma string via CURLOPT_RETURNTRANSFER
.
_RETURNTRANSFER
parece novas linhas de strip e espaço em branco extra, como se analisá-lo para exibição como código HTML padrão. _FILE
por outro lado, preserva o arquivo exatamente como foi planejado.
Eu li através da documentação em php.net, mas não encontraram qualquer coisa que parece resolver o meu problema. Idealmente, eu gostaria de ter _RETURNTRANSFER
retornar o conteúdo exato para que eu pudesse eliminar um arquivo intermediário, mas eu não vejo nenhuma maneira de tornar isso possível.
Aqui está o código que estou usando. Os dados em questão é um arquivo CSV com \ finais de linha r \ n.
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;
}
Acontece que, o erro não está no que foi a serem devolvidos, mas na forma como eu estava indo sobre analisá-lo. \ R \ n não é analisado da maneira que eu esperava quando colocado entre aspas simples, a mudança para aspas duplas resolveu o meu problema. Eu não estava ciente de que isso fez a diferença dentro de chamadas de função como essa.
Isso funciona muito bem: $cresult = split("\r\n", $cresult);
Isto não faz: $cresult = split('\r\n', $cresult);
Solução
Acontece que, o erro não está no que foi a serem devolvidos, mas na forma como eu estava indo sobre analisá-lo. \ R \ n não é analisado da maneira que eu esperava quando colocado entre aspas simples, a mudança para aspas duplas resolveu o meu problema. Eu não estava ciente de que isso fez a diferença dentro de chamadas de função como essa.
Isso funciona muito bem: $cresult = split("\r\n", $cresult);
Isto não faz: $cresult = split('\r\n', $cresult);
Outras dicas
Na maioria langage de script (também é verdade em Bash, por exemplo), aspas simples são usadas para representar as coisas como elas são escritas, enquanto aspas duplas são "analisados" (eu não acho que é a palavra apropriada, mas eu posso' t encontrar melhor).
$str = 'foo';
echo '$str'; // print “$str” to the screen
echo "$str"; // print “foo” to the screen
É verdade para as variáveis ??e escapou caracteres.
Eu não tente reproduzir o "bug" (acho que podemos considerar isso como um erro se ele é o comportamento real), mas talvez você poderia superar isso.
O PHP Doc diz que o comportement padrão é escrever o resultado em um arquivo, e que o arquivo padrão é STDOUT (janela do navegador). O que você quer é obter o mesmo resultado que em um arquivo, mas em uma variável.
Você pode fazer isso usando ob_start();
e ob_get_clean();
.
$ch = curl_init(...);
// ...
ob_start();
curl_exec($ch);
$yourResult = ob_get_clean();
curl_close($ch);
Eu sei que não é realmente a maneira limpa (se houver), mas pelo menos representativo bom trabalho.
(Por favor, desculpe-me se o meu Inglês não é perfeito; -) ...)