curl_exec () restituisce sempre false


114

Ho scritto questo semplice pezzo di codice:

$ch = curl_init();

//Set options
curl_setopt($ch, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$website_content = curl_exec ($ch);

Nel mio caso $website_contentarriva come false. Qualcuno può suggerire / consigliare qualcosa su cosa potrebbe andare storto?


8
Consultare curl_error()i dettagli sull'errore e pubblicarli qui, per favore.
Linus Kleen

@LinusKleen Se pubblichi curl_error () come risposta, lo voterò positivamente perché mi ha permesso di vedere qual era il mio problema.
Giles Roberts

Qual era esattamente il problema? Quale errore ha curl_error()rivelato?
showdev

Risposte:


242

Il controllo e la gestione degli errori sono amici del programmatore. Verificare i valori di ritorno delle funzioni cURL di inizializzazione ed esecuzione. curl_error()e curl_errno()conterrà ulteriori informazioni in caso di guasto:

try {
    $ch = curl_init();

    // Check if initialization had gone wrong*    
    if ($ch === false) {
        throw new Exception('failed to initialize');
    }

    curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt(/* ... */);

    $content = curl_exec($ch);

    // Check the return value of curl_exec(), too
    if ($content === false) {
        throw new Exception(curl_error($ch), curl_errno($ch));
    }

    /* Process $content here */

    // Close curl handle
    curl_close($ch);
} catch(Exception $e) {

    trigger_error(sprintf(
        'Curl failed with error #%d: %s',
        $e->getCode(), $e->getMessage()),
        E_USER_ERROR);

}

* Il curl_init() manuale afferma:

Restituisce un handle cURL in caso di successo, FALSE in caso di errori.

Ho osservato che la funzione viene restituita FALSEquando stai utilizzando il suo $urlparametro e il dominio non può essere risolto. Se il parametro non è utilizzato, la funzione potrebbe non restituire mai FALSE. Controllalo sempre comunque, poiché il manuale non indica chiaramente cosa siano effettivamente gli "errori".


9
+1: risoluzione dei problemi semplice e diretta per curl in PHP su curl_execFALSE return. - Curl Verbose Mode nell'esempio PHP
hakre

si. L'avevo capito molto tempo fa. Grazie per la risposta però :)
Adithya

7
Nessun problema. Ho un distintivo Revival per questo :-) Grazie per aver accettato.
Linus Kleen

@marverix beh, il suo nome è Linus: P
Nino Škopac

e non dimenticare curl_close ($ ch);
Rafik Bari

10

Nel mio caso ho bisogno di impostare VERIFYHOSTe VERIFYPEERper false, in questo modo:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

prima della chiamata a curl_exec($ch).

Perché lavoro tra due ambienti di sviluppo con certificati auto-assegnati. Con certificati validi non è necessario impostare VERIFYHOSTe VERIFYPEERto falseperché il curl_exec($ch)metodo funzionerà e restituirà la risposta che ti aspetti.


Questo è stato effettivamente utile per me. Grazie per il consiglio!
n8jadams

3

Questo è successo a me ieri e nel mio caso era perché stavo seguendo un manuale PDF per sviluppare un modulo per comunicare con un'API e mentre copiavo il collegamento direttamente dal manuale, per qualche strano motivo, il hyphencollegamento dal link copiato era in un altro codifica e quindi curl_exec()tornava sempre falseperché non era in grado di comunicare con il server.

Mi ci sono volute un paio d'ore per capire finalmente la differenza nei personaggi seguenti:

https://www.e‐example.com/api
https://www.e-example.com/api

Ogni volta che ho provato ad accedere al collegamento direttamente da un browser, è stato convertito in qualcosa di simile https://www.xn--eexample-0m3d.com/api.

Ti può sembrare che siano uguali ma se controlli la codifica del hyphens qui vedrai che il primo hyphenè un carattere unicode U + 2010 e l'altro è un U + 002D .

Spero che questo aiuti qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.