wokerman启动分析

workerman官方描述

Workerman是一款纯PHP开发的开源高性能异步PHP socket框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、MQTT物联网客户端、异步消息队列等众多高性能组件。

正如标题,我们把范围缩小.来看下启动wokerman时候源码涉及到的知识点:

如何启动一个服务

上面是一个最简单的一个例子,Wokerman类初始化时候传递了协议类型和服务地址【http类型】,

然后设置了进程数量为2,绑定了事件回调处理【onMessage】,最后核心的一步是启动这个服务

下面一步一步看下内部的实现:

调用:

初始化

spl_object_hash 将对象生成一个hash值,初始化

_pidMap数组

设置自动加载目录

注意debug_backtrace 产生一条 PHP 的回溯跟踪,此处只是获取执行脚本的目录,如果兼容5.3.6以下版本,建议debug_backtrace(false)或更高版本使用debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS),忽略 "args" 的索引,能够节省内存占用

创建资源流上下文 stream_context_create

这个是php流操作里面的一个函数,具体作用如下

上面的是个简单的stream_context_create的示例, http协议设置了请求方法 、header头、超时时间,file_get_contents请求的是一个墙外的地址,第三个参数是需要一个资源对象,这里过1s钟后如果请求不到将会返回false.

流是一个很大的话题,可以做很多有意思的事情,这里不再展开,对此感兴趣可以参考http://www.php.net/manual/zh/ref.stream.php

下面继续回到程序主逻辑初始化后:

1.设置进程数[准确的讲应该成为worker进程数]

2.绑定事件

上述表示当接收到一个消息的时候,触发onMessage绑定的function函数。

connection->send() 发送数据给客户端。

\$data 表示接收的数据。

3.启动服务

此处为该启动流程分析的核心,下面我们一起看下这里面执行了哪些操作.

php_sapi_name函数获取运行模式。

DIRECTORY_SEPARATOR 根据系统分隔符判断是否是windows操作系统

注意我们从开始设置的$worker->count参数,此处绑定woker_id => 一组count数量的进程,此处我们只有一个。

我们再来看看如何注册信号量的

首先信号量只能运行在linux环境下。

核心函数 pcntl_signal,安装一个信号处理器

保存pid

绘制命令端界面

根据上面存储的static::

_pidMap 循环fork进程

核心函数 pcntl_fork()

在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0.

调用listen

根据调用选择引入Protocols下协议文件

-------写的我好想去死,我先休息下再继续写---------

2018-09-16 天气晴

一部分信号表:

捕获信号小例子

output:

declare(ticks = 1)效率低下,每一行都检查信号发生,建议使用pcntl_signal_dispatch 捕获

多进程执行

output:

上面的代码实现了并行的运行。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181112G0JKWD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券