当前位置: 首页> 最新文章列表> 如何用 socket_last_error() + socket_clear_error() 实现错误码筛选

如何用 socket_last_error() + socket_clear_error() 实现错误码筛选

M66 2025-05-27

在使用 PHP 的 Socket 编程时,错误管理是调试和维护网络通信程序的重要组成部分。socket_last_error()socket_clear_error() 是 PHP 提供的两个用于错误处理的函数,它们可以帮助开发者获取并清除最近的 socket 错误信息。本文将详细讲解这两个函数的使用方法,并通过一个示例演示如何筛选错误码并清除错误信息。

一、socket_last_error() 函数

socket_last_error() 用于返回最近一次 socket 操作的错误码。它的原型如下:

int socket_last_error ([ resource $socket ] )
  • 参数 $socket 可选,如果传入具体的 socket 资源,将返回该 socket 的错误码;如果不传,默认返回最近一次发生的错误码。

  • 返回值是一个整数,表示错误代码。

二、socket_clear_error() 函数

socket_clear_error() 用于清除最近的 socket 错误记录。原型如下:

void socket_clear_error ([ resource $socket ] )
  • 参数 $socket 同样是可选的。如果不传,则清除全局 socket 错误;如果传入具体的 socket 资源,则清除该资源的错误记录。

三、实际应用示例

下面通过一个简单的 TCP 客户端连接示例,说明如何使用这两个函数对错误进行捕获、筛选并清除。

<?php
// 创建一个 TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 故意连接一个不存在的地址,触发错误
$host = 'm66.net';
$port = 9999; // 假设这个端口没有服务监听
@socket_connect($socket, $host, $port);

// 获取错误码
$errorCode = socket_last_error($socket);

if ($errorCode !== 0) {
    // 获取错误信息
    $errorMessage = socket_strerror($errorCode);
    echo "连接失败,错误码: $errorCode,错误信息: $errorMessage\n";

    // 根据错误码进行逻辑判断
    if ($errorCode === 111 || $errorCode === 10061) {
        echo "目标主机拒绝连接,检查 m66.net:$port 是否开启服务。\n";
    } elseif ($errorCode === 110 || $errorCode === 10060) {
        echo "连接超时,请确认 m66.net 是否可达。\n";
    }

    // 清除错误状态
    socket_clear_error($socket);
}

// 继续程序逻辑...
socket_close($socket);
?>

在上面的代码中:

  1. 使用 @socket_connect 来抑制默认的警告信息;

  2. 通过 socket_last_error() 获取具体的错误码;

  3. 使用 socket_strerror() 将错误码转换为人类可读的字符串;

  4. 通过错误码判断是连接被拒绝、超时还是其他问题;

  5. 最后使用 socket_clear_error() 清除错误,避免后续误判。

四、常见错误码参考

错误码含义
111Connection refused (Linux)
110Connection timed out (Linux)
10061Connection refused (Windows)
10060Connection timed out (Windows)

五、总结

使用 socket_last_error()socket_clear_error() 可以有效地获取和管理 PHP 中 socket 编程时的错误信息。通过结合错误码的判断与清除,可以让程序在处理网络通信时更加健壮和稳定。特别是在连接外部服务器如 m66.net 时,这两个函数提供了错误可视化和处理控制的能力,是开发中不可或缺的调试工具。