參考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.htmlphp
http://blog.csdn.net/alongken2005/article/details/8056910html
socket_accept()是服務端接受客戶端請求,一旦有一個客戶端連接上來的話,則這個函數會返回一個新的socket資源,這個資源是與客戶端通訊的資源。linux
socket_accept()是阻塞的,會一直卡在那裏。數組
發現狀況:一旦客戶端斷開連接了,會影響到服務端的主進程。如何避免這個影響呢?服務器
正常的服務器,應該是新開一個子進程來處理請求。app
socket_connect()是連接一個socket去。是客戶端使用的。socket
c語言的介紹:connect, send, recv都是同步阻塞工做模式。函數
那麼,能夠得出結論,socket_connect()也是阻塞性的。spa
php中使用協程:操作系統
http://www.laruence.com/2015/05/28/3038.html
有什麼區別呢?
stream_select()
接受一個socket流,能夠多個,一個數組形式。
等待這些流改變了狀態。改變了狀態,則會返回大於0的一個值
<?php
/* Prepare the read array */
$read = array($stream1, $stream2);//建立的兩個socket
$write = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
/* Error handling */
} elseif ($num_changed_streams > 0) {
/* At least on one of the streams something interesting happened */
}
?>
要使用引用傳遞,值會被修改。
php多路複用參考資料:http://blog.csdn.net/phphot/article/details/2020269
總結
若是沒有安裝socket擴展,則使用以下相關函數:stream_socket_client、fread()、fwrite()、stream_select()、fclose()
若是安裝了sokcet擴展,則能夠替換掉擴展的函數:
stream_socket_client等價於socket_create()
socket_select()等價於stream_select()
socket_close()等價於fclose()
socket_write()等價於fwrite()
socket_read()等價於fread()
stream_socket_client()其實是在調用linux系統的 connect()函數。
socket_select()、stream_select()都是在調用操做系統提供的select()函數。
思考:stream和socket本質有什麼區別呢?
不知道,想着去去思考socket_accept和socket_listen()區別,也許就能找到答案了。
我總把socket_accept和socket_listen()進行混淆了。
socket_accept是開始接受客戶端的連接,若是有客戶端連接上來,這個函數會返回一個socket通道的句柄,這個句柄是專門與客戶端單獨的句柄。socket_listen是開始偵聽這個socket通道,只是偵聽,並非接受客戶端的鏈接請求。