[英]cURL: connection refused from PHP, but works from command line
I have a strange behavior of cURL. 我有一个奇怪的cURL行为。
When I try to make a request using PHP functions, like this: 当我尝试使用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"
),
));
I get Failed to connect to <url_here> port 443: Connection refused
. 我
Failed to connect to <url_here> port 443: Connection refused
。
But when I try to make exactly the same call from command line (on the server, where PHP script is located), I get a valid response. 但是,当我尝试从命令行(在PHP脚本所在的服务器上)进行完全相同的调用时,我得到了有效的响应。 So, the environment is fine, nothing blocks the 443 port.
因此,环境很好,没有任何东西会阻塞443端口。
Moreover, when I run the same PHP code on another server, it also works. 而且,当我在另一台服务器上运行相同的PHP代码时,它也可以工作。
Is it possible that some PHP configuration options prevents cURL from working? 某些PHP配置选项是否有可能阻止cURL工作? Or should I check something else?
还是我应该检查其他东西?
Thanks. 谢谢。
Output of local curl_version()
: 本地
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"
}
}
Output of local curl -V
: 本地
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
Output of server's curl_version()
: 服务器的
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"
}
}
You neglected to provide the port... 您忽略了提供港口...
Check your corrected code below: 检查以下更正的代码:
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"
),
));
Thanks to Alex Blex 's comment I enabled the verbose output for PHP cURL, and also run command line cURL with -vvv
option. 感谢Alex Blex的评论,我为PHP cURL启用了详细输出,还通过
-vvv
选项运行了命令行cURL。
It made me see, that command line request was sent through the proxy, actually, whilst PHP cURL tried to make a direct call, which failed. 它让我看到,实际上是通过代理发送了命令行请求,而PHP cURL试图进行直接调用,但失败了。
Then I used CURLOPT_PROXY
option for my PHP request and it also started to work. 然后,我对PHP请求使用了
CURLOPT_PROXY
选项,它也开始起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.