curl_exec () всегда возвращает false - PullRequest
87 голосов
/ 22 ноября 2011

Я написал этот простой кусок кода:

$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. Кто-нибудь может предложить / посоветовать что-нибудь, что может пойти не так?

Ответы [ 3 ]

207 голосов
/ 09 ноября 2012

Проверка и обработка ошибок - друг программиста. Проверьте возвращаемые значения инициализирующих и выполняющих функций 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. Тем не менее, всегда проверяйте это, так как в руководстве не ясно указано, что на самом деле означают "ошибки".

2 голосов
/ 12 ноября 2017

Это случилось со мной вчера, и в моем случае это было потому, что я следовал руководству в формате PDF, чтобы разработать какой-то модуль для взаимодействия с API, и при копировании ссылки непосредственно из руководства, по какой-то странной причине, hyphen изСкопированная ссылка была в другой кодировке, и, следовательно, 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 .

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

0 голосов
/ 04 июня 2019

В моем случае мне нужно установить 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) будет работать и возвращать ожидаемый ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...