Que medidas tomar para solucionar problemas com PHP cURL?
Pergunta
Quase qualquer programador PHP trabalhando tem enfrentado ter que usar CURL para enviar solicitações HTTP crus, se é para processamento de cartão de crédito de pagamento, captura de tela nefasto, ou algo in-between.
Quase qualquer fórum onde os programadores PHP reúnem tem um grande número de pessoas que não podem obter as funções CURL para fazer o que querem .
Quando cURL não está funcionando para você, qual a solução de problemas técnicas que você usa para descobrir por que ele não está funcionando? O que gotchas estranhas com a implementação onda de PHP você correr em? Se alguém faz uma pergunta "HALP minha onda IZ quebrado" em um fórum, quais são os passos a tomar para descobrir por que seu pedido não está funcionando?
Solução
I encontrar a opção CURLINFO_HEADER_OUT para ser muito útil.
<?php $curl = curl_init('http://www.php.net'); curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'dbg_curl_data'); curl_setopt($curl, CURLOPT_WRITEFUNCTION, 'dbg_curl_data'); curl_setopt($curl, CURLINFO_HEADER_OUT, true); curl_exec($curl); echo '<fieldset><legend>request headers</legend> <pre>', htmlspecialchars(curl_getinfo($curl, CURLINFO_HEADER_OUT)), '</pre> </fieldset>'; echo '<fieldset><legend>response</legend> <pre>', htmlspecialchars(dbg_curl_data(null)), '</pre> </fieldset>'; function dbg_curl_data($curl, $data=null) { static $buffer = ''; if ( is_null($curl) ) { $r = $buffer; $buffer = ''; return $r; } else { $buffer .= $data; return strlen($data); } }
Outras dicas
Na verdade, eu nunca usar CURL (em php). O API corrente PHP é muito mais limpa, e pode ser usado para dados de pós bem. Wez Furlong tem um artigo sobre isso.
Se eu fosse usá-lo? Eu começaria com ligar todas as mensagens (definição de relatório de erros para E_ALL). Se eu achar que o PHP não me o que eu preciso nas mensagens de erro dizer, eu provavelmente usar uma abordagem de proxy para ver o que está realmente acontecendo. Alterar o URL de destino para uma página php local que contém algo como
<?php
var_dump($_POST);
var_dump($_GET);
var_dump($_SERVER);
é um caminho. Outra maneira é usar um utilitário como o netcat para escutar na porta 80 e enviar o pedido lá:
netcat -l -p 80
Isso não vai retornar nada de onda, mas vai permitir que você veja exatamente o que é enviado do servidor, o que pode ser suficiente para diagnosticar o problema.
Você também pode recuperar os cabeçalhos de PHP usando o apache_request_headers () função . Na maioria dos casos eu prefiro a abordagem netcat, no entanto, uma vez que garante que eu ver a verdade não modificada, e também exibir os dados pós-prima.