如何检查PHP脚本能否连接443端口及HTTP端口?
搞定PHP中HTTP/HTTPS端口连接验证的问题
嘿,我看你需要一个能检查HTTP/HTTPS端口连通性的PHP脚本,而且遇到了原脚本区分不开两种协议响应的问题——这很正常,因为你写的那段代码是专门为HTTPS设计的,没做HTTP的适配,而且还漏了关键的连接成功判断!
下面给你分情况整理解决方案:
1. 先搞懂核心问题:你的原脚本为啥不好用?
你原代码里硬用了ssl://前缀去连443端口,这是HTTPS专属的连接方式。如果用它去碰HTTP的80端口,肯定会直接失败;而且你没先判断$read是否连接成功,失败时的输出可能和某些HTTPS场景混在一起,才会觉得“响应结果一致”。先给你补全原脚本的错误判断:
<?php $get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE))); $read = stream_socket_client("ssl://www.raffelpages.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get); // 必须先检查连接是否成功! if (!$read) { echo "连接失败: $errstr (错误码: $errno)"; } else { $cert = stream_context_get_params($read); var_dump($cert["options"]["ssl"]["peer_certificate"]); fclose($read); }
2. 通用端口连通性检查(只看能不能连上)
如果只是想确认某个端口通不通,不管是HTTP还是HTTPS,用最轻便的fsockopen就行:
<?php function checkPortReachable($host, $port, $timeout = 30) { // 用@屏蔽警告,自己处理错误 $conn = @fsockopen($host, $port, $errno, $errstr, $timeout); if ($conn) { fclose($conn); return true; // 端口能连上 } // 这里可以根据需要返回错误信息,比如return "失败: $errstr ($errno)"; return false; } // 调用示例 var_dump(checkPortReachable('www.raffelpages.com', 80)); // 检查HTTP端口 var_dump(checkPortReachable('www.raffelpages.com', 443)); // 检查HTTPS端口
3. 区分HTTP/HTTPS的服务验证(不仅要通,还要是合法服务)
如果要确认端口上跑的是正经的HTTP或HTTPS服务,就得针对性做验证:
验证HTTP服务(80端口)
发送一个简单的HEAD请求,看是否返回标准的HTTP响应:
<?php function checkValidHttp($host, $port = 80, $timeout = 30) { $conn = @fsockopen($host, $port, $errno, $errstr, $timeout); if (!$conn) return false; // 发送HEAD请求,尽量轻量 fwrite($conn, "HEAD / HTTP/1.1\r\nHost: $host\r\nConnection: close\r\n\r\n"); $response = fgets($conn); fclose($conn); // 只要响应开头是HTTP/,就说明是合法HTTP服务 return str_starts_with($response, 'HTTP/'); } var_dump(checkValidHttp('www.raffelpages.com'));
验证HTTPS服务(443端口)
在你的原脚本基础上优化,加上证书有效性验证,确保连接的是合法的HTTPS服务:
<?php function checkValidHttps($host, $port = 443, $timeout = 30) { $context = stream_context_create([ 'ssl' => [ 'verify_peer' => true, // 验证证书是否可信 'verify_peer_name' => true, // 验证证书域名匹配 'capture_peer_cert' => true ] ]); $conn = @stream_socket_client( "ssl://$host:$port", $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context ); if (!$conn) return false; $params = stream_context_get_params($conn); fclose($conn); // 确认拿到了有效的证书 return !empty($params['options']['ssl']['peer_certificate']); } var_dump(checkValidHttps('www.raffelpages.com'));
这样下来,你就能清晰区分HTTP和HTTPS端口的连接结果啦!
内容的提问来源于stack exchange,提问作者Joanmi
相关产品推荐
相关产品推荐

