参考: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通道,只是侦听,并非接受客户端的链接请求。