請注意,在迴圈中使用此函數時(即具有網路插槽的守護進程)。例如,socket_accept() 在每次沒有可讀取的傳入連線時都會發出警告。我的 php 錯誤日誌檔案在幾秒鐘內變得非常大,最終導致伺服器崩潰。
當然,我在函數前使用了 @ 來解決這個問題。
[編輯:可以使用 (且應該) 使用 socket_select 來偵測網路插槽上的新連線(這是一個「可讀」事件)]
(PHP 4 >= 4.1.0,PHP 5,PHP 7,PHP 8)
socket_set_nonblock — 設定檔案描述符 fd 的非阻塞模式
socket_set_nonblock() 函數在 socket
參數指定的網路插槽上設定 O_NONBLOCK
旗標。
當對非阻塞網路插槽執行操作(例如接收、傳送、連線、接受...)時,腳本不會暫停執行,直到收到訊號或可以執行操作為止。相反地,如果操作會導致阻塞,則被呼叫的函數將會失敗。
範例 #1 socket_set_nonblock() 範例
<?php
$socket = socket_create_listen(1223);
socket_set_nonblock($socket);
socket_accept($socket);
?>
此範例會在連接埠 1223 的所有介面上建立一個監聽網路插槽,並將該網路插槽設定為 O_NONBLOCK
模式。socket_accept() 除非此時正好有待處理的連線,否則會立即失敗。
請注意,在迴圈中使用此函數時(即具有網路插槽的守護進程)。例如,socket_accept() 在每次沒有可讀取的傳入連線時都會發出警告。我的 php 錯誤日誌檔案在幾秒鐘內變得非常大,最終導致伺服器崩潰。
當然,我在函數前使用了 @ 來解決這個問題。
[編輯:可以使用 (且應該) 使用 socket_select 來偵測網路插槽上的新連線(這是一個「可讀」事件)]