在上一篇文章《簡單理解PHP之socket編程(二)》中,我們是使用非阻塞模式去實現單一服務端連接多個客戶端的,即先使用函數socket_set_nonblock()設置套接字為非阻塞模式,然後将連接到服務端的客戶端連接放到一個數組中,最後通過遍曆客戶端數組,分别與每一個客戶端進行數據交互。
本文我們将介紹,如何通過使用PHP函數socket_select(),來實現單一服務端連接多個客戶端。
首先,我們來看下socket_select()是做什麼的。
上圖是從PHP手冊上截取下來的。從圖中語句,我們可以得知,使用socket_select()函數,我們可以在指定的套接字上調用系統的select機制,從而實現I/O 多路複用。
當用戶進程調用了select,那麼整個進程會被block(阻塞);
而同時,kernel會“監視”所有select負責的socket;
當任何一個socket中的數據準備好了,select就會返回;
這個時候用戶進程再調用read操作,将數據從kernel拷貝到用戶進程。
所以,I/O 多路複用的特點是通過一種機制一個進程能同時等待多個文件描述符,而這些文件描述符(套接字描述符),其中的任意一個進入讀就緒狀态,select()函數就可以返回。
代碼實現如下:
服務端server.php
客戶端與之前一樣,保持不變。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!