curl_exec () zawsze zwraca false

114

Napisałem ten prosty fragment kodu:

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

W moim przypadku $website_contentjest jak false. Czy ktoś może coś zasugerować / poradzić, co może być nie tak?

Adithya
źródło
8
Skonsultuj się curl_error()ze szczegółami błędów i opublikuj je tutaj, proszę.
Linus Kleen
@LinusKleen Jeśli opublikujesz curl_error () jako odpowiedź, zagłosuję za nią, ponieważ pozwoliło mi to zobaczyć, jaki był mój problem.
Giles Roberts
Na czym dokładnie polegał problem? Jaki błąd curl_error()ujawnił?
showdev

Odpowiedzi:

242

Sprawdzanie i obsługa błędów to przyjaciel programisty. Sprawdź wartości zwracane przez inicjowanie i wykonywanie funkcji cURL. curl_error()i curl_errno()będzie zawierał dalsze informacje w przypadku awarii:

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

}

* Te curl_init() ręczne stany:

Zwraca uchwyt cURL w przypadku sukcesu, FALSE w przypadku błędów.

Zauważyłem, że funkcja zwraca się, FALSEgdy używasz jej $urlparametru, a domeny nie można rozwiązać. Jeśli parametr nie jest używany, funkcja może nigdy nie zwrócić FALSE. Zawsze jednak sprawdź to, ponieważ instrukcja nie określa jasno, czym właściwie są „błędy”.

Linus Kleen
źródło
9
+1: Proste i proste rozwiązywanie problemów z zawijaniem w PHP przy curl_execzwrocie FALSE. - Curl Verbose Mode w przykładzie PHP
hakre
Tak. Właściwie wymyśliłem to już dawno temu. Jednak dzięki za odpowiedź :)
Adithya 19.12.12
7
Nie ma problemu. Mam za to odznakę Revival :-) Dziękuję za przyjęcie.
Linus Kleen
@marverix no cóż, nazywa się Linus: P
Nino Škopac
i nie zapomnij o curl_close ($ ch);
Rafik Bari
10

W moim przypadku muszę ustawić VERIFYHOSTi VERIFYPEERna falsecoś takiego:

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

przed wezwaniem curl_exec($ch).

Ponieważ pracuję między dwoma środowiskami programistycznymi z własnymi certyfikatami. Z ważnych certyfikatów nie ma potrzeby ustawiania VERIFYHOSTi VERIFYPEERdo falseponieważ curl_exec($ch)metoda zadziała i zwróci odpowiedź można oczekiwać.

DanielaG
źródło
To było dla mnie przydatne. Dzięki za wskazówkę!
n8jadams
3

Zdarzyło mi się to wczoraj iw moim przypadku było tak, ponieważ postępowałem zgodnie z instrukcją PDF, aby opracować jakiś moduł do komunikacji z API i podczas kopiowania linku bezpośrednio z instrukcji, z jakiegoś dziwnego powodu, hyphenze skopiowanego linku był w innym kodowanie i dlatego curl_exec()zawsze zwracał, falseponieważ nie mógł skomunikować się z serwerem.

Zajęło mi kilka godzin, zanim w końcu zrozumiałem różnicę w postaciach poniżej:

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

Za każdym razem, gdy próbowałem uzyskać dostęp do łącza bezpośrednio z przeglądarki, konwertowało to na coś podobnego https://www.xn--eexample-0m3d.com/api.

Może ci się wydawać, że są równe, ale jeśli sprawdzisz kodowanie hyphens tutaj , zobaczysz, że pierwszy hyphento znaki Unicode U + 2010, a drugi to U + 002D .

Mam nadzieję, że to komuś pomoże.

OKRĄG
źródło