无法找到套接字传输“https”

36

我正在使用此代码来检查 URL 是否可用:

$fp = fsockopen($url, 443, $errno, $errstr);

我遇到了以下错误...

警告:fsockopen() [function.fsockopen]:无法连接到 https://example.com/soapserver.php:443 (无法找到套接字传输“https”-您在配置PHP时是否忘记启用它?)在C:\Home等等....

顺便说一下,我正在使用IIS服务器(不是我的选择!),所以我认为问题可能与没有安装OpenSSL有关,但我不确定。 有人可以帮忙吗?

我运行了phpinfo(),发现只有IMAP和cURL上有SSL,其他的都没有。

有什么想法吗?

6个回答

47

取消注释:php.ini 中的一行:extension=php_openssl.dll


我在编辑了那个文件之后,需要对 PHP 做些什么吗?(抱歉,我是 PHP 的新手)谢谢。 - uudaddy
刚意识到这行代码是给Windows(dll)用的,而不适用于我正在使用的Linux。 - uudaddy

29
你应该在fsockopen调用中只使用主机名,而不是URL。在实际的HTTP头中,你需要提供不包含主机/端口的URI。正如@Martijin所指出的,并且在手册页面中列出的,如果使用传输层安全性,你需要在主机名前加上ssl://表示SSL,或者tls://表示传输层安全性。 fsockopen的手册页面,查看示例#1。

17

对于 SSL,您需要在主机名前面加上 ssl:// 前缀。


这是真正的答案,但tvanfosson进行了澄清 :) - Jay
完整答案 $fp = fsockopen('ssl://'.$host, $prt , $errno , $errstr , 4) ; - Salem

4
假设您想要获取强制使用HTTPS的纽约时报:
错误的写法: $client = stream_socket_client('https://www.nytimes.com', $errno, $errstr, 30);
正确的写法: $client = stream_socket_client('tcp://www.nytimes.com:443', $errno, $errstr, 30);
请注意,我已经将“https://”替换为“tcp://”,并在主机名后附加了443端口。
我们可以说,stream_socket_client()不支持URL。

@Chris J Allen一定是在绝望的时候。 - The Onin

2

我尝试使用 ssl://,它对我有效,但我一直收到“BAD REQUEST”的响应。我发现需要添加一行来显式声明我的主机头,如这里所述,并确保已将HTTP从HTTP/1.0更新为HTTP/1.1:

$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";

0

检查 PHP 是否已安装 curl。 如果未安装,请安装 curl。 对于 Windows,请取消注释 php.ini 中的行:extension=php_openssl.dll, 对于 Ubuntu,请使用 sudo apt-get install php-curl。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接