curl_exec () gibt immer false zurück

113

Ich habe diesen einfachen Code geschrieben:

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

In meinem Fall $website_contentkommt als false. Kann jemand etwas vorschlagen / beraten, was schief gehen könnte?

Adithya
quelle
8
Konsultieren Sie curl_error()für Fehlerdetails und posten Sie diese bitte hier.
Linus Kleen
@LinusKleen Wenn Sie curl_error () als Antwort posten, werde ich es positiv bewerten, da ich sehen konnte, was mein Problem war.
Giles Roberts
Was genau war das Problem? Welcher Fehler hat curl_error()ergeben?
Showdev

Antworten:

241

Die Fehlerprüfung und -behandlung ist der Freund des Programmierers. Überprüfen Sie die Rückgabewerte der initialisierenden und ausführenden cURL-Funktionen. curl_error()und curl_errno()enthält weitere Informationen im Fehlerfall:

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

}

* Das curl_init() Handbuch besagt:

Gibt bei Erfolg ein cURL-Handle zurück, bei Fehlern FALSE .

Ich habe beobachtet, dass die Funktion zurückgegeben wird, FALSEwenn Sie ihren $urlParameter verwenden und die Domäne nicht aufgelöst werden konnte. Wenn der Parameter nicht verwendet wird, wird die Funktion möglicherweise nie zurückgegeben FALSE. Überprüfen Sie es trotzdem immer, da im Handbuch nicht klar angegeben ist, was "Fehler" tatsächlich sind.

Linus Kleen
quelle
9
+1: Einfache und direkte Fehlerbehebung für Curl in PHP bei curl_execFALSE Return. - Curl Verbose Mode im PHP-Beispiel
hakre
Ja. Hatte das schon vor langer Zeit herausgefunden. Vielen Dank für die Antwort :)
Adithya
7
Kein Problem. Habe ein Revival-Abzeichen dafür :-) Danke fürs Akzeptieren.
Linus Kleen
@ Marverix gut, sein Name ist Linus: P
Nino Škopac
und vergiss nicht curl_close ($ ch);
Rafik Bari
9

In meinem Fall muss ich Satz VERIFYHOSTund VERIFYPEERzu false, wie folgt aus :

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

vor dem Anruf an curl_exec($ch).

Weil ich zwischen zwei Entwicklungsumgebungen mit selbst zugewiesenen Zertifikaten arbeite. Bei gültigen Zertifikaten müssen Sie keine Einstellungen VERIFYHOSTvornehmen VERIFYPEER, falseda die curl_exec($ch)Methode funktioniert und die erwartete Antwort zurückgibt.

DanielaG
quelle
Das war wirklich nützlich für mich. Danke für den Tipp!
n8jadams
3

Dies geschah mir gestern und in meinem Fall, weil ich einem PDF-Handbuch folgte, um ein Modul für die Kommunikation mit einer API zu entwickeln, und während ich den Link direkt aus dem Handbuch hyphenkopierte , befand sich der aus dem kopierten Link aus irgendeinem seltsamen Grund in einem anderen Codierung und daher curl_exec()kehrte die immer zurück, falseweil sie nicht mit dem Server kommunizieren konnte.

Ich habe ein paar Stunden gebraucht, um endlich den Unterschied in den folgenden Charakteren zu verstehen:

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

Jedes Mal, wenn ich versuchte, direkt über einen Browser auf den Link zuzugreifen, wurde er in so etwas wie konvertiert https://www.xn--eexample-0m3d.com/api.

Es mag Ihnen scheinen, dass sie gleich sind, aber wenn Sie die Codierung der hyphens hier überprüfen, werden Sie sehen, dass das erste hyphenein Unicode-Zeichen U + 2010 und das andere ein U + 002D ist .

Hoffe das hilft jemandem.

KREIS
quelle