Curl_exec() всегда возвращает false
Я написал этот простой кусок кода:
$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
.
Может ли кто-нибудь предлагать/советовать что-то, что может пойти не так?
Ответы
Ответ 1
Проверка и обработка ошибок - друг программиста. Проверьте возвращаемые значения инициализирующих и выполняющих функций 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);
}
* The curl_init()
ручные состояния:
Возвращает дескриптор cURL в случае успеха, FALSE при ошибках.
Я наблюдал, как функция возвращает FALSE
когда вы используете ее параметр $url
и домен не может быть разрешен. Если параметр не используется, функция может никогда не вернуть FALSE
. Тем не менее, всегда проверяйте это, так как в руководстве четко не указано, что такое "ошибки".
Ответ 2
Это случилось со мной вчера, и в моем случае это было потому, что я следовал руководству в формате 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
здесь, вы увидите, что first hyphen
является символом unicode U + 2010, а второй - U + 002D.
Надеюсь, это поможет кому-то.
Ответ 3
В моем случае мне нужно установить VERIFYHOST
и VERIFYPEER
в false
, как это:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
перед вызовом curl_exec($ch)
.
Вы найдете полезную проверку возвращаемого значения curl_exec($ch)
, например:
$result = curl_exec($ch);
if (!$result) {
var_dump(curl_error($ch));
}