简介
一,Socket 扩展是基于流行的 BSD sockets,实现了和 socket 通讯功能的底层接口,它可以和客户端一样当做一个 socket 服务器。
PHP两种创建socket方法:
1,stream_socket_server 方法创建 Internet 或 Unix 域服务器套接字。(PHP层封装)
2,socket_create 方法创建一个套接字(通讯节点)。(socket模块需要额外开启)
二,Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。
三,套接字的特性有三个属性
1,域(domain),域名端口。
2,类型(type),SOCK_STREAM(tcp)、SOCK_DGRAM(udp)、SOCK_RAW(原始)。
3,和协议(protocol)。
缓冲
网络中通信数据并不是直接传递到程序,而是放入缓冲区,当缓冲区数据积累到一定的量后有TCP协议底层负责处理,read()/recv()读取缓冲区数据,write()/send()发送数据到缓冲区。
如果机器突然结束工作可能会造成缓冲区中的数据丢失。
例子
使用PHP stream_socket_server 方法创建套接字。
// TCP 服务器套接字
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}
// UDP 服务器套接字
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("$errstr ($errno)");
}
do {
$pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
echo "$peer\n";
stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);
学习workman原理
workman底层实现的方式是使用 stream_socket_server
Workerman\Worker 类
参考
https://www.php.net/manual/zh/book.sockets.php
https://blog.csdn.net/qq_42606136/article/details/115863353
https://mp.weixin.qq.com/s/VazobOgY9QVaADpEur81ng