2009-05-02 34 views
12

Casi todos los programadores PHP que trabajan han tenido que usar CURL para enviar solicitudes HTTP sin procesar, ya sea para procesamiento de pago con tarjeta de crédito, raspado de pantalla nefasto o algo intermedio.¿Qué pasos da para solucionar problemas con PHP cURL?

Casi cualquier foro donde los programadores de PHP se congregan tiene un gran número de personas que can't get the cURL functions to do what they want.

Cuando cURL no funciona para usted, ¿qué técnicas de solución de problemas utiliza para descubrir por qué no está funcionando? ¿Qué problemas inesperados con la implementación de curl de PHP has encontrado? Si alguien pregunta "HALP MY CURL IZ BROKEN" en un foro, ¿cuáles son los pasos que debe seguir para descubrir por qué su solicitud no funciona?

+0

sólo tiene que utilizar CURLOPT_HEADER para obtener la cabecera .. No hay necesidad de que la función –

Respuesta

15

Encuentro que la opción CURLINFO_HEADER_OUT es muy ú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); 
    } 
}
+0

¿esto también funciona en los datos de publicación? Estoy obteniendo el error 'Advertencia: curl_exec() [function.curl-exec]: No se pudo llamar a CURLOPT_WRITEFUNCTION en C: \ xampp \ htdocs \ my_project \ login.php' donde en ine 49 se escribe' $ res = curl_exec ($ curl); ' – diEcho

+0

Sí, también funciona con datos POST. Parece que el nombre de la función que has pasado a curl_setopt/CURLOPT_WRITEFUNCTION en realidad no se resuelve en una función/invocable. – VolkerK

+1

Guau, esta fue una solución muy limpia y eficiente. Realmente me ayudó toneladas, gracias! – angularsen

3

En realidad, nunca uso CURL (en php). La API API api es mucho más ordenada y también se puede usar para POSTAR datos. Wez Furlong tiene un artículo sobre esto.

¿Si tuviera que usarlo? Comenzaría por activar todos los mensajes (estableciendo informes de errores en E_ALL). Si encuentro que PHP no me dice lo que necesito en los mensajes de error, probablemente usaré un enfoque de proxy para ver qué está sucediendo realmente. Cambiar la URL de destino a una página local de php que contenga algo como

<?php 
var_dump($_POST); 
var_dump($_GET); 
var_dump($_SERVER); 

es de una sola dirección. Otra forma es utilizar una utilidad como netcat a la escucha en el puerto 80 y enviar la solicitud de ahí:

netcat -l -p 80 

Esto no va a devolver nada a curvarse, pero le permitirá ver exactamente lo que se envía al servidor, que podría ser suficiente para diagnosticar el problema.

También puede recuperar los encabezados de PHP utilizando la función apache_request_headers(). En la mayoría de los casos, prefiero el enfoque de netcat, ya que garantiza que veo la verdad no modificada y también visualizo los datos de entrada sin procesar.

+0

Eso es un gran punto de la biblioteca corriente. ¿Las funciones de transmisión están disponibles si las envolturas de URL fopen están desactivadas? –

+0

Las funciones de transmisión están probablemente disponibles, pero el ejemplo al que me he vinculado todavía requiere que la conexión real se realice mediante fopen(), lo que significa que no funcionará con allow_url_fopen desactivado. Si ese es el caso, estás condenado a usar curl. Personalmente, siempre lo enciendo y evito cometer los errores que convierten a la url en un problema de seguridad desde el principio. :) –

+0

Definitivamente me gusta la API api. Como nota al margen: php (o la extensión curl) se puede compilar para usar curl como controlador para algunos wrappers de url. – VolkerK