PHP cURL использует тайм-аут на некоторых URL-адресах, но командная строка всегда работает

Когда я пытаюсь использовать PHP cURL-методы для НЕКОТОРЫХ URL-адресов, время истекает. Когда я использую командную строку для одного и того же URL-адреса, он работает нормально.

Я использую AWS и имею блок t2.medium, в котором запущены библиотеки apache php-55 из yum.

Вот мой PHP-код:

function curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept-Language: en-us'
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
$fh = fopen('/home/ec2-user/curllog', 'w');
curl_setopt($ch, CURLOPT_STDERR, $fh);
$a = curl_exec($ch);
curl_close($ch);
fclose($fh);
$headers = explode("\n",$a);
var_dump($headers);
var_dump($a);
exit;

        return $result;
}

Итак, вот вызов, который работает очень хорошо:

curl('http://www.google.com');

И это возвращает данные для главной страницы google.

Однако я пробую еще один URL:

curl('http://www.trulia.com/profile/agent-1391347/overview');

И я получаю это в curllog:

[[email protected] Node]$ cat ../curllog
* Hostname was NOT found in DNS cache
*   Trying 23.0.160.99...
* Connected to www.trulia.com (23.0.160.99) port 80 (#0)
> GET /profile/agent-1391347/overview HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
Host: www.trulia.com
Accept: */*
Accept-Language: en-us

* Operation timed out after 10002 milliseconds with 0 bytes received
* Closing connection 0

Если я запустил это из командной строки:

curl -s www.trulia.com/profile/agent-1391347/overview

НЕМЕДЛЕННО возвращается (в течение 1 секунды) с выходом NO. Это ожидается. Однако, когда я запускаю это:

curl -sL www.trulia.com/profile/agent-1391347/overview

Он возвращает страницу правильно, так же, как хотелось бы.

Итак, что не так с моим завивом?

PHP 5.5.20

Вот бит cURL из моего phpinfo():

curl

cURL support => enabled
cURL Information => 7.38.0
Age => 3
Features
AsynchDNS => Yes
CharConv => No
Debug => No
GSS-Negotiate => No
IDN => Yes
IPv6 => Yes
krb4 => No
Largefile => Yes
libz => Yes
NTLM => Yes
NTLMWB => Yes
SPNEGO => Yes
SSL => Yes
SSPI => No
TLS-SRP => No
Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host => x86_64-redhat-linux-gnu
SSL Version => NSS/3.16.2 Basic ECC
ZLib Version => 1.2.7
libSSH Version => libssh2/1.4.2

Ответ 1

Я проверил вашу функцию curl() Кажется хорошо. Не нужно ничего менять в функции. Что вам нужно сделать, так это просто передать URL-адрес, поскольку он не нужен для параметра HTTPS to HTTP

curl('http://www.trulia.com/profile/agent-1391347/overview');

Причина:

Вы уже сказали curl не проверять SSL

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Сообщите мне, если вам нужно объяснение.

Ответ 2

Попробуйте увеличить значения таймаута в следующих строках:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

Это довольно короткие значения таймаута - CURLOPT_TIMEOUT ограничивает все время выполнения, попробуйте дать более крупные значения:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

Ответ 3

У вас есть 2 ПЕРЕМЕННЫХ

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

Первый, CURLOPT_CONNECTTIMEOUT - максимальное количество времени, разрешенное для соединения с сервером.

Вы можете отключить его, установив его на 0.

Это

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);

Но это не хороший метод, если вы находитесь в рабочей среде, потому что он никогда не будет тайм-аут.

Теперь CURLOPT_TIMEOUT

От Документация по PHP

Максимальное количество секунд для выполнения функций cURL.

Установите его на некоторое более высокое значение

curl_setopt($ch, CURLOPT_TIMEOUT, 20); // 20 Seconds.

Ответ 4

Подробный вывод показывает явную проблему с таймаутом:

  • Операция завершена после 10002 миллисекунд с полученными 0 байтами

Это сигнализирует о проблеме с настройкой сети. Их сложнее найти, это может быть на вашем собственном уровне (например, в контексте веб-сервера или исполняемого файла PHP) или на другом конце. Оба места возможны в определенной степени, однако сервер принимает оба запроса, даже если они имеют разные заголовки запросов, поэтому более вероятно, что это связанный с исполнением контекст, который также описывает его.

Проверьте, есть ли какие-либо ограничения на безопасность и другие сетевые уровни для выполнения этих запросов через PHP. Например. попробуйте другой образ сервера, если вы не вникаете в системное администрирование и устранение неполадок. Из того, что разделяют в вашем вопросе, трудно сказать, что именно заставляет ваш тайм-аут.