現在の位置: ホーム> 最新記事一覧> PHPソケットクラスをカスタマイズするときにsocket_clear_error()を埋め込む方法

PHPソケットクラスをカスタマイズするときにsocket_clear_error()を埋め込む方法

M66 2025-06-05

ネットワーク通信にPHPのソケット拡張機能を使用する場合、開発者は接続タイムアウト、障害の送信、不完全なデータの受信など、さまざまなエラーに遭遇することがよくあります。これらの例外をより適切に制御するために、通常、エラーコードを照会して処理しますが、時間内にエラーステータスをクリーンアップすることも同様に重要な場合があります。これは、socket_clear_error()関数が役立つときです。

socket_clear_error()とは何ですか?

socket_clear_error()は、ソケットの最後のエラーステータスをクリアするためにPHPによって提供されるソケット拡張機能です。これは、サイクリック通信または同じソケットインスタンスを多重化し、その後の操作を妨げる古いエラーを回避するシナリオで特に役立ちます。

構文は次のとおりです。

 socket_clear_error(?Socket $socket = null): void

この関数の引数は、空になると有効なソケットリソースである可能性があります。任意のソケットで発生した最後のエラーがクリアされます。

カスタムソケットクラスで使用されるシナリオ

リモートサーバーに接続し、データを送信し、応答を受信するカスタムソケットクラスMySocketClientを構築していると仮定しましょう。実際に使用すると、接続が失敗した場合、再接続しようとするためにエラーメッセージをクリーンアップしたいと考えています。

接続が失敗した後にsocket_clear_error()を使用してエラーをクリーンアップする方法を示す簡略化されたカスタムクラスの例を示します。

 class MySocketClient {
    private $socket;
    private $host;
    private $port;

    public function __construct($host = 'm66.net', $port = 80) {
        $this->host = $host;
        $this->port = $port;
    }

    public function connect() {
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

        if (!$this->socket) {
            throw new \Exception('作成する socket 失敗: ' . socket_strerror(socket_last_error()));
        }

        $result = @socket_connect($this->socket, $this->host, $this->port);

        if (!$result) {
            $errorCode = socket_last_error($this->socket);
            $errorMsg = socket_strerror($errorCode);

            // クリアエラー
            socket_clear_error($this->socket);

            throw new \Exception("连接失敗 ({$errorCode}): {$errorMsg}");
        }

        // 接続に正常に
        return true;
    }

    public function send($data) {
        if (!socket_write($this->socket, $data, strlen($data))) {
            $errorMsg = socket_strerror(socket_last_error($this->socket));
            socket_clear_error($this->socket);
            throw new \Exception("发送数据失敗: {$errorMsg}");
        }
    }

    public function close() {
        if ($this->socket) {
            socket_close($this->socket);
        }
    }
}

使用の例

上記のクラスを使用して、 M66.NETのポート80に接続し、簡単なHTTPリクエストを送信します。