查詢

socket_set_nonblock()函式—用法及示例

「 將給定的套接字標記為非阻塞模式,這意味著在讀取和寫入資料時,不會阻塞程序 」


函式名:socket_set_nonblock()

適用版本:PHP 4 >= 4.1.0, PHP 5, PHP 7

用法:socket_set_nonblock(resource $socket)

函式描述:socket_set_nonblock() 函式將給定的套接字標記為非阻塞模式,這意味著在讀取和寫入資料時,不會阻塞程序。

引數:

  • $socket: 必需,要設定為非阻塞模式的套接字資源。

返回值:成功時返回 true,失敗時返回 false。

示例:

<?php
// 建立套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 設定套接字為非阻塞模式
if (socket_set_nonblock($socket)) {
    echo "套接字設定為非阻塞模式成功!\n";
} else {
    echo "套接字設定為非阻塞模式失敗!\n";
}

// 連線到伺服器
if (socket_connect($socket, '127.0.0.1', 8080) === false) {
    // 非阻塞模式下,連線可能會立即返回失敗
    $error = socket_last_error($socket);
    if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) {
        echo "連線伺服器失敗:" . socket_strerror($error) . "\n";
    } else {
        echo "連線正在進行中...\n";
    }
}

// 讀取資料
$data = socket_read($socket, 1024);
if ($data === false) {
    // 非阻塞模式下,如果沒有資料可讀取,會立即返回 false
    $error = socket_last_error($socket);
    if ($error != SOCKET_EAGAIN) {
        echo "讀取資料失敗:" . socket_strerror($error) . "\n";
    } else {
        echo "沒有可讀取的資料。\n";
    }
}

// 寫入資料
$message = "Hello, Server!";
if (socket_write($socket, $message, strlen($message)) === false) {
    // 非阻塞模式下,如果無法立即寫入資料,會立即返回 false
    $error = socket_last_error($socket);
    if ($error != SOCKET_EAGAIN) {
        echo "寫入資料失敗:" . socket_strerror($error) . "\n";
    } else {
        echo "無法立即寫入資料。\n";
    }
}

// 關閉套接字
socket_close($socket);
?>

上述示例中,我們首先建立了一個套接字,然後使用 socket_set_nonblock() 函式將套接字設定為非阻塞模式。接下來,我們嘗試連線到伺服器,如果連線失敗,根據錯誤碼判斷是否連線正在進行中。然後,我們嘗試讀取資料,如果沒有可讀取的資料,根據錯誤碼判斷是否沒有資料可讀取。最後,我們嘗試寫入資料,如果無法立即寫入資料,根據錯誤碼判斷是否無法立即寫入。最後,我們關閉套接字。

請注意,非阻塞模式下,某些操作可能會立即返回而不是阻塞等待。因此,您需要根據返回值或錯誤碼來處理相應的情況。

補充糾錯
上一個函式: socket_set_option()函式
下一個函式: socket_set_blocking()函式
熱門PHP函式
分享連結