作者:路霄峰_121 | 来源:互联网 | 2022-09-27 11:27
本篇文章给大家介绍一下workerman,以及谈谈workerman中worker类的用法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
workerman简单开发demo
实现简单的http服务器
require_once 'workman/Autoloader.php';
use \Workerman\Worker;
$http_work = new Worker('http://0.0.0.0:1111’);
$http_work->OnMessage= function($conn,$data){
$conn->send('hello workman');
};
Worker::runAll();
浏览器 访问 ip:1111 即可
实现websocket
ws.php
require_once 'workman/Autoloader.php';
use \Workerman\Worker;
$http_work = new Worker('websocket://0.0.0.0:2222');
$http_work->OnMessage= function($conn,$data){
$conn->send('hello workman'.$data);
};
Worker::runAll();
workerman原理
onWorkerStart
设置Worker子进程启动时的回调函数,每个子进程启动时都会执行。
回掉函数参数 $worker Worker 对象
$worker->OnWorkerStart= function($worker){
//代码
};
$worker->OnWorkerStart= 'test’;
function test($worker){
echo 'hhhhh';
}
onConnect
当客户端与Workerman建立连接时(TCP三次握手完成后)触发的回调函数。每个连接只会触发一次onConnect回调。
回调函数的参数
$connection
连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等
$worker->OnConnect= function($connection){
echo 'new connect....'.$connection->getRemoteIp();
};
onMessage
当客户端通过连接发来数据时(Workerman收到数据时)触发的回调函数
回调函数的参数
$connection
连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等
$data
客户端连接上发来的数据,如果Worker指定了协议,则$data是对应协议decode(解码)了的数据
$worker->OnMessage= function($connection,$data){
echo $data;
$connection->send('hello '.$data.PHP_EOL);
};
onClose
当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose。每个连接只会触发一次onClose。由于断网或者断电等极端情况断开的连接 ,也就无法及时触发onClose,这种情况需要通过应用层心跳来解决
$worker->OnClose= function($connection){
echo 'connection close';
};
onError
当客户端的连接上发生错误时触发。
目前错误类型有
1、调用Connection::send由于客户端连接断开导致的失败(紧接着会触发onClose回调) (code:WORKERMAN_SEND_FAIL msg:client closed)
2、在触发onBufferFull后(发送缓冲区已满),仍然调用Connection::send,并且发送缓冲区仍然是满的状态导致发送失败(不会触发onClose回调)(code:WORKERMAN_SEND_FAIL msg:send buffer full and drop package)
3、使用AsyncTcpConnection异步连接失败时(紧接着会触发onClose回调) (code:WORKERMAN_CONNECT_FAIL msg:stream_socket_client返回的错误消息)
onWorkerReload
此特性不常用到。
设置Worker收到reload信号后执行的回调。
可以利用onWorkerReload回调做很多事情,例如在不需要重启进程的情况下重新加载业务配置文件。
onBufferFull
每个连接都有一个单独的应用层发送缓冲区,如果客户端接收速度小于服务端发送速度,数据会在应用层缓冲区暂存,如果缓冲区满则会触发onBufferFull回调。
缓冲区大为TcpConnection::$maxSendBufferSize,默认值为1MB,可以为当前连接动态设置缓冲区大小例
onBufferDrain
每个连接都有一个单独的应用层发送缓冲区,缓冲区大小由TcpConnection::$maxSendBufferSize决定,默认值为1MB,可以手动设置更改大小,更改后会对所有连接生效。
Worker类接口方法
runAll
运行所有Worker实例。
Worker::runAll()执行后将永久阻塞,也就是说位于Worker::runAll()后面的代码将不会被执行。所有Worker实例化应该都在Worker::runAll()前进行。
stopAll
停止当前进程(子进程)的所有Worker实例并退出。
此方法用于安全退出当前子进程,作用相当于调用exit/die退出当前子进程。
listen
用于实例化Worker后执行监听。
Worker类代码流程分析
public function __construct($socket_name = '', $context_option = array())
public static function runAll()
{
static::checkSapiEnv(); //检测命令行模式
static::init(); //初始化日志 pid workid…
static::lock(); //启动文件 加锁 独占锁
static::parseCommand(); //解析命令 start stop restart …
static::daemonize(); //守护进程运行
static::initWorkers(); //初始化 所有worker 实例
static::installSignal(); //安装信号
static::saveMasterPid(); //保存主进程id
static::unlock(); //解锁
static::displayUI(); //展示UI
static::forkWorkers(); //fork 进程
static::resetStd(); //重置输入输出
static::monitorWorkers(); //主进程监控各个worker的状态
}
SAPI(Server Application Programming Interface)服务器应用程序编程接口,即PHP与其他应用交互的接口,PHP脚本要执行有很多方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。
常见的SAPI有:cgi、fast-cgi、cli、apache模块的DLL、isapi
Linux 常用SIG信号及其键值
01 SIGHUP 挂起(hangup)
02 SIGINT 中断,当用户从键盘按^c键或^break键时
03 SIGQUIT 退出,当用户从键盘按quit键时
04 SIGILL 非法指令
05 SIGTRAP 跟踪陷阱(trace trap),启动进程,跟踪代码的执行
06 SIGIOT IOT指令
07 SIGEMT EMT指令
08 SIGFPE 浮点运算溢出
09 SIGKILL 杀死、终止进程
10 SIGBUS 总线错误
11 SIGSEGV 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置
12 SIGSYS 系统调用中参数错,如系统调用号非法
13 SIGPIPE 向某个非读管道中写入数据
14 SIGALRM 闹钟。当某进程希望在某时间后接收信号时发此信号
15 SIGTERM 软件终止(software termination)
16 SIGUSR1 用户自定义信号1
17 SIGUSR2 用户自定义信号2
18 SIGCLD 某个子进程死
更多计算机编程相关知识,请访问:编程视频!!
以上就是浅谈workerman中worker类的用法的详细内容,更多请关注其它相关文章!