#php #curl
#php #curl
Вопрос:
Следующая конфигурация cURL отлично работает на моем локальном компьютере с использованием cURL 7.30.0:
$curl = curl_init();
curl_setopt_array($curl, array(
// Just showing the noteworthy options here.
CURLOPT_HTTPHEADER => array("Content-Type: application/x-www-form-urlencoded")
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_0,
CURLOPT_COOKIE => "foo=bar",
));
$response = curl_exec($curl);
curl_close($curl);
Выдержка из выходных данных отладки:
> GET / HTTP/1.0
Host: example.com
Accept: */*
Cookie: foo=bar
Content-Type: application/x-www-form-urlencoded
Теперь я запускаю тот же код в среде общего хостинга с cURL 7.19.7 и получаю:
> GET / HTTP/1.1
Host: example.com
Accept: */*
Content-Type: application/x-www-form-urlencoded
В основном cURL работает на 99% нормально, но игнорирует принудительную версию HTTP и строку cookie. Использует ли хостинговая компания конфигурацию, которая блокирует эти функции? Является ли версия cURL, которую они используют, слишком старой? Что здесь происходит?
Комментарии:
1. Проверьте версию CURL, работающую на обоих. Кроме того, если вы делаете HTTP-запросы с PHP, я бы рекомендовал отказаться от cURL и в пользу лучшего, более современного HTTP-клиента, такого как github.com/rdlowrey/Artax
2. Спасибо, Бенджамин. Я добавил номера версий к вопросу. Спасибо и за совет, добавил его в закладки. Однако сейчас я улучшаю существующий код cURL, поэтому было бы проще решить эту проблему для моего текущего проекта, чем переписывать все целиком.
3. Вы обращались в службу поддержки хостинговой компании? Они могут пролить некоторый свет на вашу проблему. Я должен сказать, что я понимаю, почему вы озадачены различными результатами, возвращаемыми ‘cUrl’ в похожих обстоятельствах.
4. Я жду ответа от хостинговой компании Ryan, но SO обычно в миллион раз быстрее и подробнее :).
5. Я действительно не понимаю, как это может быть связано с версиями libcurl или чем-то еще. Cookie и функциональность HTTP-версии работают надежно и одинаково уже МНОГО лет… (Я написал этот код и поддерживаю libcurl)
Ответ №1:
Я нашел это. curl_setopt_array
завершает обработку параметров, как только один из вариантов выходит из строя, я этого не знал. Я должен был проверить возвращаемое значение, чтобы убедиться, что все в порядке.
В моем случае виновником был option CURLOPT_FOLLOWLOCATION
. Вероятно, произошел сбой, потому что хостинг-провайдер использует безопасный режим, который отключает функцию follow 301/302.
$curl = curl_init();
$check = curl_setopt_array($curl, $options);
if(!$check)
die("Ye be warned: one of your options did not make it.");
$response = curl_exec($curl);
curl_close($curl);