2009-05-02 4 views
12

Quasi tutti i programmatori PHP che lavorano hanno dovuto utilizzare CURL per inviare richieste HTTP non elaborate, sia che si tratti di elaborazione di pagamenti con carta di credito, di scarsi scatti dello schermo o di qualcosa di intermedio.Quali misure si prendono per risolvere i problemi con PHP cURL?

Quasi qualsiasi forum in cui i programmatori PHP si riuniscono ha un gran numero di persone che can't get the cURL functions to do what they want.

Quando cURL non funziona per voi, quali tecniche di risoluzione dei problemi si usa per capire perché non funziona? Quali sono le cose strane con l'implementazione di curl di PHP? Se qualcuno fa una domanda "HALP MY CURL IZ BROKEN" su un forum, quali sono i passaggi da seguire per capire perché la loro richiesta non funziona?

+0

basta usare CURLOPT_HEADER per ottenere l'intestazione .. Non c'è bisogno di quella funzione –

risposta

15

trovo l'opzione CURLINFO_HEADER_OUT per essere molto utile.

<?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

funziona anche su dati post ?? im ottenendo l'errore 'Attenzione: curl_exec() [function.curl-exec]: non può chiamare l'CURLOPT_WRITEFUNCTION in C: \ xampp \ htdocs \ my_project \ login.php' dove sulla ine 49 c'è scritto' $ res = curl_exec ($ curl); ' – diEcho

+0

Sì, funziona anche con i dati POST. Sembra che il nome della funzione che hai passato a curl_setopt/CURLOPT_WRITEFUNCTION in realtà non risolva una funzione/callable. – VolkerK

+1

Wow, questa è stata una soluzione molto pulita ed efficiente. Davvero mi ha aiutato a tonnellate, grazie! – angularsen

3

In realtà, io non uso mai CURL (in php). PHP stream api è molto più ordinato e può essere utilizzato anche per i dati POST. Wez Furlong ha un articolo su questo.

Se dovessi usarlo? Comincerei con l'attivazione di tutti i messaggi (impostazione dell'errore nella segnalazione a E_ALL). Se scopro che PHP non mi dice cosa ho bisogno nei messaggi di errore, probabilmente utilizzerei un approccio proxy per vedere cosa sta realmente accadendo. Cambiare l'URL di destinazione in una pagina php locale contenente qualcosa come

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

è unidirezionale. Un altro modo è quello di utilizzare un programma di utilità come netcat in ascolto sulla porta 80 e invia la richiesta c'è:

netcat -l -p 80 

Questo non restituirà nulla ad arricciarsi, ma vi permetterà di vedere esattamente ciò che viene inviato al server, che potrebbe essere sufficiente per diagnosticare il problema.

È possibile anche recuperare le intestazioni da PHP tramite la funzione apache_request_headers(). Nella maggior parte dei casi, preferisco l'approccio netcat, poiché garantisce che vedo la verità non modificata e che visualizzo anche i dati grezzi dei post.

+0

Questo è un ottimo punto sulla libreria flusso. Le funzioni di streaming sono disponibili se i wrapper urop di fopen sono disattivati? –

+0

Le funzioni di streaming sono probabilmente disponibili, ma l'esempio che ho collegato richiede ancora la connessione effettiva da eseguire usando fopen(), il che significa che non funzionerà con allow_url_fopen disattivato. Se è così, sei condannato a usare l'arricciatura. Personalmente, lo accendo sempre ed evito di commettere errori che trasformano l'url in un problema di sicurezza sin dall'inizio. :) –

+0

Mi piace decisamente la stream api. Come nota a margine: php (o l'estensione curl) può essere compilato per usare curl come gestore per alcuni url wrapper. – VolkerK