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 () як відповідь, я підтримаю це, оскільки це дозволило мені побачити, у чому моя проблема.
Giles Roberts

У чому саме була проблема? Яку помилку curl_error()виявив?
showdev

Відповіді:


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: Просте і пряме усунення неполадок для завивки в PHP при curl_execповерненні ЛЖ. - Curl Verbose Mode в прикладі PHP
хакре

так. Насправді це давно зрозуміло. Дякую за відповідь, хоча :)
Адітя

7
Нема проблем. Отримав знак відродження за це :-) Дякую, що прийняли.
Лінус Клін

@marverix добре, його звуть Лінус: P
Nino Škopac

і не забувайте 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скопійоване посилання було іншим кодування і, отже, curl_exec()завжди повертався, falseоскільки не зміг спілкуватися з сервером.

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

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

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

Вам може здатися, що вони рівні, але якщо ви перевірте кодування hyphens тут, ви побачите, що перший hyphen- це символи Unicode U + 2010, а другий - U + 002D .

Сподіваюся, що це комусь допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.