cURL игнорирует параметры

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