當前位置: 首頁> 最新文章列表> 如何用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()清除錯誤,避免後續誤判。

四、常見錯誤碼參考

錯誤碼含義
111 Connection refused (Linux)
110 Connection timed out (Linux)
10061 Connection refused (Windows)
10060 Connection timed out (Windows)

五、總結

使用socket_last_error()socket_clear_error()可以有效地獲取和管理PHP 中socket 編程時的錯誤信息。通過結合錯誤碼的判斷與清除,可以讓程序在處理網絡通信時更加健壯和穩定。特別是在連接外部服務器如m66.net時,這兩個函數提供了錯誤可視化和處理控制的能力,是開發中不可或缺的調試工具。