workerman介绍worker类

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协议实现
    │   ├── 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();

  

 

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'); };
 

客户端连接发送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 = 2*1024*1024;






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 #其它资料 

posted @ 2019-05-15 13:23  来阿里啊呀  阅读(1522)  评论(0编辑  收藏  举报