workerman介绍

yum install php-process即可安装pcntl和posix扩展

https://www.workerman.net/doc

php stat.php start -d #这是在守护进程里面

需要了解的基本概念

1、TCP传输层协议

TCP是一种面向连接的、可靠的、基于IP传输层协议。TCP传输层协议一个重要特点是TCP是基于数据流的,客户端的请求会源源不断的发送给服务端,服务端收到的数据可能不是一个完整的请求,也有可能是多个请求连在一起。这就需要我们在这源源不断的数据流中区分每个请求的边界。而应用层协议主要是为请求边界定义一套规则,避免请求数据混乱。

2、应用层协议

应用层协议(application layer protocol)定义了运行在不同端系统上(客户端、服务端)的应用程序进程如何相互传递报文,例如HTTP、WebSocket都属于应用层协议。例如一个简单的应用层次协议可以如下{“module”:“user”,“action”:“getInfo”,“uid”:456}\n"。此协议是以"\n"(注意这里"\n"代表的是回车)标记请求结束,消息体是字符串。

3、短连接

短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。像WEB网站的HTTP服务一般都用短连接。

短连接应用程序开发可以参考基本开发流程一章

4、长连接
长连接,指在一个连接上可以连续发送多个数据包。

注意:长连接应用必须加心跳,否则连接可能由于长时间不活跃而被路由节点防火墙断开。

长连接多用于操作频繁,点对点的通讯的情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多。所以长连接在每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

当需要主动向客户端推送数据时,例如聊天类、即时游戏类、手机推送等应用需要长连接。 长连接应用程序开发可以参考Gateway/Worker开发流程

目录结构

Workerman // workerman内核代码
├── Connection // socket连接相关
│ ├── ConnectionInterface.php// socket连接接口
│ ├── TcpConnection.php // Tcp连接类
│ ├── AsyncTcpConnection.php // 异步Tcp连接类
│ └── UdpConnection.php // Udp连接类
├── Events // 网络事件库
│ ├── EventInterface.php // 网络事件库接口
│ ├── Libevent.php // Libevent网络事件库
│ ├── Ev.php // Libev网络事件库
│ └── Select.php // Select网络事件库
├── Lib // 常用的类库
│ ├── Constants.php // 常量定义
│ └── Timer.php // 定时器
├── Protocols // 协议相关
│ ├── ProtocolInterface.php // 协议接口类
│ ├── Http // http协议相关
│ │ └── mime.types // mime类型
│ ├── Http.php // http协议实现
│ ├── Text.php // Text协议实现f
│ ├── Frame.php // Frame协议实现
│ └── Websocket.php // websocket协议的实现
├── Worker.php // Worker
├── WebServer.php // WebServer
└── Autoloader.php // 自动加载类

Worker类用于实现端口的监听,并可以设置客户端连接事件、连接上消息事件、连接断开事件的回调函数,从而实现业务处理


require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;

// 运行在主进程 监听地址
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
#赋值过程运行在主进程  向客户端发送数据 

$tcp_worker->onMessage = function($connection, $data)
{
 	#这部分运行在子进程 hello 返回给浏览器    --发送给客户端
  $connection->send('hello ' . $data);
};

Worker::runAll();

<html里面>

 <script>

ws = new WebSocket('ws://192.168.113.138:22222'); //这是连接websocket协议 

$worker->protocol = 'workerman\\Protocols\\websocket'; #换个websocket协议

#连接成功发数据,我发个东西 

ws.onopen=function() { 
  ws.send('lampol')
}

#接受服务端发送过来的数据 就是从$connection->send('hello websocket')
ws.onmessage= function(e){
  console.log(e.data)
}

</script>

master 管理 worker进程 (处理数据会分下面的worker进程)

在这里插入图片描述

master worker模型说明:

master进程为主进程,启动过程中读取conf配置,根据每个应用配置中的ip和端口创建监听socket,然后再根据配置中的进程数创建对应数量的子进程即worker进程,worker进程会自动继承master进程创建的监听socket,使得worker进程能够独立的接受并处理客户端的连接。而后master进程进入监听信号的逻辑中,监听worker进程退出信号(worker进程退出后,系统会自动向master进程发送一个SIGHCLD信号,mater进程会重新创建子进程,将缺失的子进程补上),master进程还会监听workermand脚本发来的停止信号(SIGINT)和平滑重启服务信号(SIGHUP)

worker进程为master进程派生出来的子进程,自动继承了master进程的监听socket,每个worker进程独立的接受并处理客户端的连接。

master worker模型比较适合业务简单的应用或者短连接应用

在这里插入图片描述

设置当前worker实例启动该多少个进程,不设置时默认为1

进程数设置依据

1、cpu核数

2、内存大小

3、业务偏向IO密集还是cpu密集型

不清楚自己业务偏向于哪种类型,可设置进程数为CPU核数的2倍左右即可

lscpu top -> 1 查看cpu核数

cpu 0 就是1个cpu

use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
 
Worker::$daemonize = true;
// 所有的打印输出全部保存在/tmp/stdout.log文件中
Worker::$stdoutFile = '/tmp/stdout.log';
$worker = new Worker('text://0.0.0.0:8484');
$worker->onWorkerStart = function($worker)
{
    echo "Worker start\n";
};
// 运行worker
Worker::runAll();

在这里插入图片描述

use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

Worker::$daemonize = true;
// 所有的打印输出全部保存在/tmp/stdout.log文件中
Worker::$stdoutFile = '/tmp/stdout.log';
$worker = new Worker('text://0.0.0.0:8484');
$worker->onWorkerStart = function($worker)
{
    echo "Worker start\n";
};
// 运行worker
Worker::runAll();

id: 每个进程都有个id,当前worker进程的id编号,范围为0到$worker->count-1. 进程重启后id编号值是不变的。

name: 设置当前Worker实例的名称,方便运行status命令时识别进程。不设置时默认为none。
protocol: 设置当前Worker实例的协议类。 注:协议处理类可以直接在初始化Worker在监听参数时直接指定$worker = new

 Worker('tcp://0.0.0.0:8686'); #定义一个tpc
 $worker->protocol = 'Workerman\\Protocols\\Http'; #又指定要给http协议,最后实现http协议,用http协议访问 

transport: 设置当前Worker实例所使用的传输层协议,目前只支持3种(tcp、udp、ssl)。不设置默认为tcp。
daemonize: 此属性为全局静态属性,表示是否以daemon(守护进程)方式运行。如果启动命令使用了 -d参数(php index.php start -d),则该属性会自动设置为true。也可以代码中手动设置 (Worker::$daemonize = true;)

logFile:

 Worker::$logFile = '/tmp/workerman.log';

#启动日志的位置

stdoutFile: 此属性为全局静态属性,如果以守护进程方式(-d启动)运行,则所有向终端的输出(echo var_dump等)都会被重定向到stdoutFile指定的文件中。默认是查下workerman_std.log 手动设置

Worker::$stdoutFile = '/tmp/stdout.log';

pidFile: 进程号 Worker::$pidFile = ‘/var/run/workerman.pid’;

connections: 存储了当前进程的所有的客户端连接对象,其中id为connection的id编号

 Timer::add(10, function()use($worker)
    {
    $worker->connections #这个是worker属性  
        // 遍历当前进程所有的客户端连接,发送当前服务器的时间
        #foreach($worker->connections as $connection)
        #{
            #$connection->send(time());
        #}
    });

回调属性

onWorkerStart 有4个子进程,就会有4个 设置Worker子进程启动时的回调函数,每个子进程启动时都会执行。
  
在这里插入图片描述

或者

在这里插入图片描述

输出

在这里插入图片描述

onConnect: 当客户端与Workerman建立连接时(TCP三次握手完成后)触发的回调函数。每个连接只会触发一次onConnect回调

$connection

连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等

$worket->onConnect = function($connection) { 
	echo 'new connect ....'.$connection->getRemotelp().PHP_EOL;  #当客户连接的时候获得对方ip
}

在这里插入图片描述

客户端连接
在这里插入图片描述

onMessage
    当客户端通过连接发来数据时(Workerman收到数据时)触发的回调函数

$connection

连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等

$data #服务端发送过来的数据

客户端连接上发来的数据,如果Worker指定了协议,则$data是对应协议decode(解码)了的数据

$worker = new Worker('websocket://0.0.0.0:8484');
            #$connection连接的对象  #$data客户端发来的数据 
$worker->onMessage = function($connection, $data)
{
    var_dump($data);
  #往客户端发数据
    $connection->send('receive success');
};

xQ

客户端连接发送123

在这里插入图片描述

onClose
 当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose。每个连接只会触发一次onClose

$worker->onClose = function($connection)
{
    echo "connection closed\n";
};

onBufferFull
  每个连接都有一个单独的应用层发送缓冲区,如果客户端接收速度小于服务端发送速度,数据会在应用层缓冲区暂存,如果缓冲区满则会触发onBufferFull回调
   设置当前连接发送缓冲区,单位字节

  $connection->maxSendBufferSize = 102400;

也可以利用TcpConnection::$defaultMaxSendBufferSize 设置所有连接默认缓冲区的大小,例如代码:

use Workerman\Connection\TcpConnection;
  
  设置所有连接的默认应用层发送缓冲区大小,单位字节
  TcpConnection::$defaultMaxSendBufferSize = 210241024;

stopAll() 客户端给我发数据大于5次,我就断开

在这里插入图片描述

设置端口复用
onWorkersStart 当有进程启动

// 每个进程启动后在当前进程新增一个Worker监听
$worker->onWorkerStart = function($worker)
{
    $inner_worker = new Worker('http://0.0.0.0:2016');
    // 设置端口复用,可以创建监听相同端口的Worker(需要PHP>=7.0)
    $inner_worker->reusePort = true;
    $inner_worker->onMessage = 'on_message';
    // 执行监听。正常监听不会报错   在加上端口复用
    $inner_worker->listen();
};

https://blog.csdn.net/fastjack/article/details/79523363 #其它资料

http://doc.workerman.net/worker/on-buffer-full.html #其它资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值