Workerman Manual

Workerman Manual

Workerman 不依赖于 php-fpm、apache、nginx 容器,这些容器做不到与客户端保持长连接。

Workerman 单个进程可以支持上万的并发连接,多进程则支持数十万的,甚至百万并发连接。

简单实例:http://doc3.workerman.net/getting-started/simple-example.html

一 使用 HTTP 协议对外提供 Web 服务;
二 使用 WebSocket 协议
三 直接使用 TCP 传输数据(不使用任何应用层协议)
测试:telnet 127.0.0.1 2347

curl -Ss http://www.workerman.net/check.php | php
PHP Version >= 5.3.3 [OK]
Extension pcntl check [OK]
Extension posix check [OK]

debug mode: php start.php start

daemon: php start.php start -d

stop: php start.php stop

restart: php start.php restart

reload: php start.php reload

status: php start.php status

kill: php start.php kill (version >= 3.2.2)

平滑重启,进程中最好不要保存用户相关的状态信息,即业务进程最好是无状态的,避免由于进程退出导致信息丢失。

主进程会向其中一个子进程发送安全退出(让对应进程处理完毕当前请求后才退出)信号,当这个进程退出后,主进程会重新创建一个新的子进程(这个子进程载入了新的PHP代码),然后主进程再次向另外一个旧的进程发送停止命令,这样一个进程一个进程的重启,直到所有旧的进程全部被置换为止。

请求周期差异
PHP在Web应用中一次请求过后会释放所有的变量与资源
WorkerMan开发的应用程序在第一次载入解析后便常驻内存,使得类的定义、全局对象、类的静态成员不会释放,便于后续重复利用

Workerman 目录结构

Workerman // workerman 内核代码

| — Connection // socket 连接相关
| | — ConnectionInterface.php // socket 连接接口
| | — TcpConnection.php // Tcp 连接类
| | — AsyncTcpConnection.php // 异步 Tcp 连接类
| | — UdpConnection.php // Udp 连接类
|
| — Events
| | — EventInterface.php // 网络事件库接口
| | — Libevent.php // Libevent 网络事件库
| | — Ev.php // libel 网络事件库
| | — 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 // web socket 协议的实现
|
| — Worker.php // worker
|
| — WebServer.php // WebServer
|
| — Autoloader.php // 自动加载类

命名空间名字与目录路径对应,并以开发者的项目根目录为基准
普通函数及变量名采用小写加下划线方式
类成员及类的方法采用首字母小写的驼峰形式
函数及类的参数采用小写加下划线方式

<****监听地址****> ****可以为以下格式:
如果是unix套接字,地址为本地一个磁盘路径
非unix套接字,地址格式为 <本机ip>:<端口号>
<本机ip>可以为0.0.0.0表示监听本机所有网卡,包括内网ip和外网ip及本地回环127.0.0.1
<本机ip>如果以为127.0.0.1表示监听本地回环,只能本机访问,外部无法访问
<本机ip>如果为内网ip,类似192.168.xx.xx,表示只监听内网ip,则外网用户无法访问
<本机ip>设置的值不属于本机ip则无法执行监听,并且提示Cannot assign requested address错误
注意:<端口号>不能大于65535。<端口号>如果小于1024则需要root权限才能监听。监听的端口必须是本机未被占用的端口,否则无法监听,并且提示Address already in use错误

void Worker::listen(void)

用于实例化Worker后执行监听。
此方法主要用于在Worker进程启动后动态创建新的Worker实例,能够实现同一个进程监听多个端口,支持多种协议。
例如一个http Worker启动后实例化一个websocket Worker,那么这个进程即能通过http协议访问,又能通过websocket协议访问。由于websocket Worker和http Worker在同一个进程中,所以它们可以访问共同的内存变量,共享所有socket连接。可以做到接收http请求,然后操作websocket客户端完成向客户端推送数据类似的效果。

Workerman 两个重要类 Worker 与 Connection。

每个客户端连接对应一个 Connection 对象,可以设置对象的 onMessage、onClose 等回调。
也提供了向客户端发送数据 send 接口,关闭连接 close 接口,以及其他必要接口。

可以理解成,Worker 是一个监听容器,负责接收客户端连接,并把连接包装成 connection 对象,提供给开发者操作。

Workerman 是多进程的,每个进程内部维护一个自增的 connection_id,所以多进程之间的 connection_id 会有重复。

如果想要不重复的 connection_id,可以根据给 connection->id 重新赋值,如;加上 worker 前缀。

Connection 类

string Connectin::$protocol
设置当连接的协议类

<?php

use Workerman\Worker;

require_once ‘./Workerman/Autoload.php’;

$worker = new Worker(’tcp://0.0.0.0:8484’);

$worker->onConnect = function($connection)
{
$connection->protocol = ‘Workerman\Protocols\Https’;
};

$worker->onMessage = function($connection, $data)
{
// send 时会自动调用$connection->protocol::encode(),打包数据后再发送
$connection->send(“hello”);
};

Worker::runAll();

Connection::$worker,此属性为只读属性,即当前connection对象所属的worker实例

Connection::$maxSendBufferSize, 设置当前链接的应用层发送缓冲区大小。不设置默认为 Connection::$defaultMaxSendBufferSize (1 MB)

Connection::$defaultmaxSendBufferSize, 全局静态属性,设置所有链接的默认应用层发送缓冲区大小。默认为 1 M

Connection::$maxPackageSize, 全局静态属性,设置每个链接能够接收的最大包包长。默认为 10 M

回调属性

Connection::$onMessage

作用与 Worker::$onMessage 回调相同,区别是只针对当前链接有效。

$worker->onConnection = function($conncection)
{
$connection->onMessage = function($connection, $data)
{
$connection->send(‘receive success’);
}
}

// 一样的代码

$worker->onMessage = function($connection, $data)
{
$connection->send(‘receive success’);
}

Connection::$onclose

作用与 Worker::$onClose 回调相同,区别是只针对当前链接有效。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,462评论 24 1,003
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,126评论 5 124
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,958评论 0 9
  • 四月末的周四,由于太过卖力的上课,终于伤到喉咙,后面反复疼痛,一直以为喉咙痛,但几天不见好,就去看五官,五官科说声...
    芰荷塘阅读 269评论 2 0