简单理解Socket
PHP简单socket编程
Socket进程通信机制
总结socket和http的区别
PHP实现系统编程(一) --- 网络Socket及IO多路复用
PHP并发IO编程之路 这个才是重点!
Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
流程:
服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
服务器为socket绑定ip地址和端口号
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
![](/qrcode.jpg)
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
客户端连接成功,向服务器发送连接状态信息
服务器accept方法返回,连接成功
客户端向socket写入信息
服务器读取信息
客户端关闭
服务器端关闭
PHP提供了两种类型的socket:socket 和 stream_socket, 二者api不兼容。
socket
socket_create 创建的socket更底层,基本和c的socket接口一样,可以设置很多socket选项,
和c接口一样使用起来比较繁琐。操作底层socket必须使用socket_xx系列函数,无法使用stream类型的函数,比如无法使用fread fwrite,同时也就无法使用stream相关的过滤器、streamWrapper、ssl加密等。使用socket_*必须安装socket扩展。
stream_socket
stream_socket_server 是php自带的接口,不需要安装任何扩展。接口使用非常简单,socket_xx几行代码搞定的事情stream_socket_server一行就搞定了。
stream_socket_server创建的socket属于stream类型,可以用stream相关的函数操作,fread、fwrite等等都行。可以使用stream相关的高级特性,过滤器、streamWrapper、ssl加密等。
但是其缺点也很明显,很多socket选项无法精确设置。
【所以当无法完成精确设置的时候,可以借助socket_import_stream将stream_socket转换成扩展的sockets,然后就可以通过socket_set_option设置stream_socket的socket选项了】。
socket框架:
workerman和swoole都是php socket 服务器框架,都支持长连接、tcp和udp、websocket、异步、分布式部署等
workerman纯php写的,swoole是php的c扩展,性能肯定更高,百度、腾讯不少产品的server就是基于swoole的
workerman上手更快,文档更丰富,社区活跃,社区基本做到有问必答。