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?


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”.


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ć.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.