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);

Foi útil?

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; -) ...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top