У меня странное поведение cURL.
Когда я пытаюсь сделать запрос, используя функции PHP, например:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://<url_here>",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => "<body here>",
CURLOPT_HTTPHEADER => array(
"content-type: application/xml"),
));
я получил Failed to connect to <url_here> port 443: Connection refused
,
Но когда я пытаюсь сделать точно такой же вызов из командной строки (на сервере, где находится PHP-скрипт), я получаю правильный ответ. Итак, обстановка в порядке, ничто не блокирует порт 443.
Более того, когда я запускаю тот же код PHP на другом сервере, он также работает.
Возможно ли, что некоторые параметры конфигурации PHP мешают работе cURL? Или я должен проверить что-то еще?
Благодарю.
Выход местного curl_version()
:
array(9) {
["version_number"]=>
int(470784)
["age"]=>
int(3)
["features"]=>
int(968605)
["ssl_version_number"]=>
int(0)
["version"]=>
string(6) "7.47.0"["host"]=>
string(19) "x86_64-pc-linux-gnu"["ssl_version"]=>
string(14) "OpenSSL/1.0.2g"["libz_version"]=>
string(5) "1.2.8"["protocols"]=>
array(21) {
[0]=>
string(4) "dict"[1]=>
string(4) "file"[2]=>
string(3) "ftp"[3]=>
string(4) "ftps"[4]=>
string(6) "gopher"[5]=>
string(4) "http"[6]=>
string(5) "https"[7]=>
string(4) "imap"[8]=>
string(5) "imaps"[9]=>
string(4) "ldap"[10]=>
string(5) "ldaps"[11]=>
string(4) "pop3"[12]=>
string(5) "pop3s"[13]=>
string(4) "rtmp"[14]=>
string(4) "rtsp"[15]=>
string(3) "smb"[16]=>
string(4) "smbs"[17]=>
string(4) "smtp"[18]=>
string(5) "smtps"[19]=>
string(6) "telnet"[20]=>
string(4) "tftp"}
}
Выход местного curl -V
:
curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets
Вывод сервера curl_version()
:
array(9) {
["version_number"]=>
int(462597)
["age"]=>
int(2)
["features"]=>
int(1597)
["ssl_version_number"]=>
int(0)
["version"]=>
string(6) "7.15.5"["host"]=>
string(23) "x86_64-redhat-linux-gnu"["ssl_version"]=>
string(15) " OpenSSL/0.9.8b"["libz_version"]=>
string(5) "1.2.3"["protocols"]=>
array(9) {
[0]=>
string(4) "tftp"[1]=>
string(3) "ftp"[2]=>
string(6) "telnet"[3]=>
string(4) "dict"[4]=>
string(4) "ldap"[5]=>
string(4) "http"[6]=>
string(4) "file"[7]=>
string(5) "https"[8]=>
string(4) "ftps"}
}
Вы забыли предоставить порт …
Проверьте исправленный код ниже:
curl_setopt_array($curl, array(
CURLOPT_URL => "https://<url_here>",
CURLOPT_PORT => "443", //MY CORRECTION TO YOUR CODE
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => "<body here>",
CURLOPT_HTTPHEADER => array(
"content-type: application/xml"),
));
(увидеть эта почта также…)
Благодаря Алекс Блекс«s комментарий Я включил подробный вывод для PHP cURL, а также запустил командную строку cURL с -vvv
вариант.
Это заставило меня увидеть, что запрос командной строки был отправлен через прокси, в то время как PHP cURL попытался сделать прямой вызов, который не удался.
Тогда я использовал CURLOPT_PROXY
вариант для моего запроса PHP, и он также начал работать.