You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:04:41