PHP 日本研討會 2024

socket_set_nonblock

(PHP 4 >= 4.1.0,PHP 5,PHP 7,PHP 8)

socket_set_nonblock設定檔案描述符 fd 的非阻塞模式

描述

socket_set_nonblock(Socket $socket): bool

socket_set_nonblock() 函數在 socket 參數指定的網路插槽上設定 O_NONBLOCK 旗標。

當對非阻塞網路插槽執行操作(例如接收、傳送、連線、接受...)時,腳本不會暫停執行,直到收到訊號或可以執行操作為止。相反地,如果操作會導致阻塞,則被呼叫的函數將會失敗。

參數

socket

使用 socket_create()socket_accept() 建立的 Socket 實例。

回傳值

成功時回傳 true,失敗時回傳 false

變更日誌

版本 描述
8.0.0 socket 現在是 Socket 實例;先前,它是 resource

範例

範例 #1 socket_set_nonblock() 範例

<?php
$socket
= socket_create_listen(1223);
socket_set_nonblock($socket);

socket_accept($socket);
?>

此範例會在連接埠 1223 的所有介面上建立一個監聽網路插槽,並將該網路插槽設定為 O_NONBLOCK 模式。socket_accept() 除非此時正好有待處理的連線,否則會立即失敗。

參見

新增註解

使用者貢獻的註解 1 則註解

kpobococ at gmail dot com
15 年前
請注意,在迴圈中使用此函數時(即具有網路插槽的守護進程)。例如,socket_accept() 在每次沒有可讀取的傳入連線時都會發出警告。我的 php 錯誤日誌檔案在幾秒鐘內變得非常大,最終導致伺服器崩潰。

當然,我在函數前使用了 @ 來解決這個問題。

[編輯:可以使用 (且應該) 使用 socket_select 來偵測網路插槽上的新連線(這是一個「可讀」事件)]
To Top