curl_exec () всегда возвращает false


114

Я написал этот простой фрагмент кода:

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

В моем случае $website_contentидет как false. Может ли кто-нибудь предложить / посоветовать что-то, что может пойти не так?


8
Проконсультируйтесь curl_error()с подробностями об ошибках и разместите их здесь, пожалуйста.
Линус Клин

@LinusKleen Если вы опубликуете curl_error () в качестве ответа, я проголосую за него, поскольку это позволило мне увидеть, в чем была моя проблема.
Джайлс Робертс

В чем именно была проблема? Какую ошибку curl_error()выявили?
showdev 05

Ответы:


242

Проверка и обработка ошибок - друг программиста. Проверьте возвращаемые значения инициализирующих и выполняемых функций cURL. curl_error()и curl_errno()будет содержать дополнительную информацию в случае сбоя:

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

}

* В curl_init() руководстве указано:

Возвращает дескриптор cURL в случае успеха, FALSE в случае ошибки.

Я заметил, что функция возвращается, FALSEкогда вы используете ее $urlпараметр, и домен не может быть разрешен. Если параметр не используется, функция может никогда не вернуться FALSE. Тем не менее, всегда проверяйте это, поскольку в руководстве четко не указано, что такое «ошибки» на самом деле.


9
+1: Простое и прямое устранение неисправностей для curl в PHP при curl_execвозврате FALSE. - Режим Curl Verbose Mode в примере PHP
hakre

Да. На самом деле понял это давно. Спасибо за ответ :)
Adithya

7
Нет проблем. Получил за это значок Revival :-) Спасибо, что приняли.
Linus Kleen

@marverix ну, его зовут Линус: P
Нино Шкопач

и не забывайте curl_close ($ ch);
Рафик Бари

10

В моем случае мне нужно установить VERIFYHOSTи VERIFYPEERв false, как это:

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

перед звонком curl_exec($ch).

Потому что я работаю между двумя средами разработки с самоназначенными сертификатами. С действительными сертификатами нет необходимости устанавливать VERIFYHOSTи VERIFYPEERв falseпотому , что curl_exec($ch)метод будет работать и возвращать ответ вы ожидаете.


Это было действительно полезно для меня. Спасибо за чаевые!
n8jadams

3

Это случилось со мной вчера, и в моем случае это было связано с тем, что я следовал руководству в формате PDF для разработки некоторого модуля для связи с API, и при копировании ссылки непосредственно из руководства по какой-то странной причине hyphenиз скопированной ссылки был другой encoding и, следовательно, curl_exec()всегда возвращался, falseпотому что не мог связаться с сервером.

Мне потребовалось пару часов, чтобы наконец понять разницу в следующих персонажах:

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

Каждый раз, когда я пытался получить доступ к ссылке прямо из браузера, она конвертировалась во что-то вроде https://www.xn--eexample-0m3d.com/api.

Вам может показаться, что они равны, но если вы проверите кодировку hyphens здесь, вы увидите, что первый hyphen- это символы Юникода U + 2010, а другой - U + 002D .

Надеюсь, это кому-то поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.