Причины, почему cURL мог бы нормально подключаться через командную строку, но не в PHP? - PullRequest
0 голосов
/ 23 декабря 2018

Недавно у меня начались проблемы с фрагментом кода, который был стабильным в течение достаточно долгого времени.Он устанавливает соединение с GameStop, чтобы получить страницу там.Несколько лет работал нормально, но теперь возвращает тайм-аут.

Сначала я предположил, что была какая-то блокировка IP или пользовательского агента.Тем не менее, я запустил совершенно новые машины на DigitalOcean и Vultr, и у обеих возникла одна и та же проблема.Хотя все машины могут использовать cURL через командную строку и нормально получать страницу.

Как ни странно, код также работает на моей локальной машине разработки, которая представляет собой Windows-коробку.Так что, не уверены, связана ли проблема с PHP, работающим в Linux?

<code><?php

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'https://www.gamestop.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
//curl_setopt($ch, CURLOPT_SSLVERSION, 6); -explicitly use TLS v1.2

$html = curl_exec($ch);
$info = curl_getinfo($ch);
$error = curl_error($ch);
curl_close($ch);

echo '<pre>' . var_export($error, true) . '
'.'
' . var_export($info, true) . '
'.'HTML: ';?>

Приведенный выше код возвращает время ожидания в любой нелокальной среде, в которой я пытался его запустить. В тех же средах страницу можно получить с помощью cURL через командную строку.Я нашел несколько похожих вопросов, но большинство указывает на проблему с версией SSL / TLS.Я также пытался это проверить (см. Закомментированную строку), но с тем же результатом.

Часть проблемы в том, что я не уверен, что существует реальный способ отладки тайм-аута, поступающего с сервера,как на самом деле все это может быть причиной.Единственная реальная подсказка, с которой я столкнулся, это то, что она работает на компьютере с Windows и в командной строке в более высоких средах.Будем благодарны за любую помощь или советы!

Редактировать: Также удалось воспроизвести проблему на виртуальной машине Windows Server 2016.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Скорее всего, это потому, что curl-cli автоматически добавляет заголовок агента пользователя, а libcurl / php - нет.

какая-то блокировка IP или пользовательского агента.Тем не менее, я запустил совершенно новые машины на DigitalOcean и Vultr, и у обоих возникла одна и та же проблема

Настройка виртуальных машин на DigitalOcean / Vultr не будет автоматически заставлять libcurl добавлять заголовки пользовательских агентов к вашим httpsЗапросы.это можно сделать с помощью:

curl_setop($ch,CURLOPT_USERAGENT,"curl/".(curl_version()["version"])); // User-Agent: curl/7.52.1

, чтобы имитировать строку user-agent curl-cli, или что-то вроде

curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");

, чтобы представить, что вы Google Chrome версии 71, работающейв Windows 7 x64.

многие веб-сайты (например, Wikipedia.com) блокируют запросы http без заголовка агента пользователя.

0 голосов
/ 23 декабря 2018

Хотя в действительности это не объясняет , почему это происходит, я смог обойти проблему, используя shell_exec в PHP для непосредственного выполнения командной строки cURL, а затем извлекать / обрабатывать результаты.

...