swoole-server-manager
swoole-server-manager copied to clipboard
swoole-server-manager / 常驻服务管理框架
#swoole-server-manager swoole 服务管理框架
###目录
- 说明
- 特色
- 流程图
- 运行
- TODO
- 说明
像后台常驻服务,agent这类的用go开发都比较多。优点就不说了(性能,兼容好,开发相对快)。
最近要写个后台服务,可能还是php写多了(go写了点还是不顺手,怪我笨),还是用php写吧,刚好可以用swoole处理进程之间的工作, 所以便有了此项目。
此项目为后台服务开发提供了一些常用的功能(个人认为)
- 后台服务需要常驻后台,完成不同的业务功能。此处可以把业务按子进程分开
- 子进程和主进程(master) 需要进行双向通信。(传递各个子进程的业务信息或者子进程接收master的命令执行相关业务)
- 后台服务需要提供api, 进行服务(子进程)管理,比如返回子进程的状态,信息,开启关闭不同的子进程等
- 子进程异常退出,master能够自动拉起(这个swoole 已经做好了)
- 子进程内执行的业务也可能遇到堵塞的情况,所以加了队列功能进行业务异步的处理(放弃swoole的task)
- 特色
- 基于最新swoole
- 针对后台常驻服务相关开发的框架
- 使用 resque (redis队列)处理耗时流程处理
- 支持动态增加相关服务进程(通过api)
- 方便扩展的api, 后台服务进程
- 流程图

- 运行
一个简单的demo
运行
php demo/simple.php
code
<?php
require dirname(__DIR__) . '/autoload.php';
//队列的基本设置
ServerManager\Queue\Queue::setConfig([
'host' => 'localhost:6379',
'name' => 'default',
'classBase' => 'ServerManager\demo\simple\queue'
]);
//框架实例
$server = new ServerManager\Manager\Server();
//设置服务api类
$server->setApiClassName('ServerManager\demo\simple\TestController');
//设置 process 设置
$server->setProcessConfig([
//服务子进程名称,唯一,如果进程类代码都一样,还是请设置不同的名字。
'process_name' => [
//子进程类
'class' => 'ServerManager\demo\simple\process\DemoServer',
//子进程启动入参
'params' => ['data' => 1]
],
'process_name_two' => [
'class' => 'ServerManager\demo\simple\process\DemoServer',
'params' => ['data' => 2]
]
]);
//启动唠
$server->run();
####api访问 访问 http://127.0.0.1:9501/api/index 路由指到 src/demo/simple/TestController.php => actionIndex TestController内可进行扩展。
####主进程与子进程通信 访问 http://127.0.0.1:9501/api/status 路由指到 src/demo/simple/TestController.php => actionStatus
public function actionStatus()
{
//向所有子进程发送status命令
$this->_manager->sendCommandAll('status');
//堵塞接收所有子进程返回status命令的执行结果
$result = $this->_manager->getCommandAll();
var_dump($result);
return $result;
}
子进程处理status命令,返回执行结果
src/demo/simple/process/DemoServer.php => commandStatus
public function commandStatus()
{
return [
'name' => $this->name,
'count' => $this->params['data'] * 2,
'error' => 20
];
}
####子进程内队列的使用 访问 http://127.0.0.1:9501/api/queue 路由指到 src/demo/simple/TestController.php => actionQueue
/**
* 测试 process 发送 queue
*/
public function actionQueue()
{
$this->_manager->sendCommand('process_name_two', 'queue', 'queue_1');
}
子进程process_name_two执行queue命令
public function commandQueue()
{
$data = [
'email' => '[email protected]',
'text' => 'hello ! ' . $this->name,
'date' => date('Y-m-d H:i:s')
];
//子进程内投递队列,第一个参数:队列work类名
$this->sendQueue('EmailWork', $data);
}
队列EmailWork 对应文件 ServerManager\demo\simple\queue\EmailWork
work写法参照php-resque
class EmailWork extends \ServerManager\Queue\Queue
{
public function perform()
{
// Work work work
var_dump($this->args);
}
}
- TODO
- 子进程增加接口实现
- 子进程删除接口实现
- 子进程异常,会堵塞master与子进程间的通信
- 队列现在只有一个进程处理,考虑任意多进程处理