函式名: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() 函式將套接字設定為非阻塞模式。接下來,我們嘗試連線到伺服器,如果連線失敗,根據錯誤碼判斷是否連線正在進行中。然後,我們嘗試讀取資料,如果沒有可讀取的資料,根據錯誤碼判斷是否沒有資料可讀取。最後,我們嘗試寫入資料,如果無法立即寫入資料,根據錯誤碼判斷是否無法立即寫入。最後,我們關閉套接字。
請注意,非阻塞模式下,某些操作可能會立即返回而不是阻塞等待。因此,您需要根據返回值或錯誤碼來處理相應的情況。