From ca282247422ba8de3c4e9ac2d758429c4d45ad41 Mon Sep 17 00:00:00 2001 From: bingcool <2437667702@qq.com> Date: Fri, 17 Mar 2023 11:47:51 +0800 Subject: [PATCH] add goApp single instance --- README.md | 140 ++++++++++++++++++++++++++++++++----- src/Core/Func/function.php | 20 ++++++ 2 files changed, 142 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 9ef2a859..0f482754 100755 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ swoolefy-5.0+ 版本: 目前主分支,最低要求php8.0+,swoole5.0+(或者swoole-cli-v5.0+), 或者也可以使用swoole-cli4.8+, 因为其内置php8.1+ swoolefy-4.8-lts 版本: -长期维护分支,最低要求php >= php7.2 && php < php8.0, 推荐直接swoole-v4.8+,需要通过源码编译安装 +长期维护分支,最低要求php >= php7.2 && php < php8.0, 推荐直接swoole-v4.8+,需要通过源码编译安装swoole 选择哪个版本? 1、如果确定项目是使用php8+的,那么直接选择 swoole-v5.0+ 以上版本来编译安装或者直接使用swoole-cli-v5.0,然后选择 ```bingcool/swoolefy:~5.0.2``` 作为项目分支 @@ -32,25 +32,25 @@ swoolefy-4.8-lts 版本: ### 实现的功能特性 基础特性 -- [x] 架手脚一键创建项目 -- [x] 路由与调度,MVC三层,多级配置 +- [x] 支持架手脚一键创建项目 +- [x] 支持路由映射与调度,MVC三层,多级配置 - [x] 支持composer的PSR-4规范,实现PSR-3的日志接口 - [x] 支持自定义注册不同根命名空间,快速多项目部署 - [x] 支持httpServer,实用轻量Api接口开发 -- [x] 支持websocketServer,udpServer,mqttServer +- [x] 支持多协议websocketServer、udpServer、mqttServer - [x] 支持基于tcp实现的rpc服务,开放式的系统接口,可自定义协议数据格式,并提供rpc-client协程组件 -- [x] 支持DI容器,组件IOC、配置化 +- [x] 支持DI容器,组件IOC、配置化,Channel公共组件池 - [x] 支持协程单例注册,协程上下文变量寄存 - [x] 支持mysql、postgreSql协程组件、redis协程组件、mongodb组件 - [x] 支持mysql的协程连接池,redis协程池 - [x] 支持protobuf buffer的数据接口结构验证,压缩传输等 -- [x] 异步务管理TaskManager,定时器管理TickManager,内存表管理TableManager -- [x] 自定义进程管理ProcessManager,进程池管理PoolsManger +- [x] 支持异步务管理TaskManager,定时器管理TickManager,内存表管理TableManager +- [x] 支持自定义进程管理ProcessManager,进程池管理PoolsManger - [x] 支持底层异常错误的所有日志捕捉,支持全局日志,包括debug、info、notice、warning、error等级 - [x] 支持自定义进程的redis,rabbitmq,kafka的订阅发布,消息队列等 - [x] 支持热更新reload worker 监控以及更新 - [x] 支持定时的系统信息采集,并以订阅发布,udp等方式收集至存贮端 -- [x] 命令行形式高度封装启动|停止控制的脚本,简单命令即可管理整个框架 +- [x] 支持命令行形式高度封装启动|停止控制的脚本,简单命令即可管理整个框架 高级特性 - [x] 支持crontab的local调用和fork独立进程的计划任务 @@ -87,11 +87,6 @@ swoolefy-4.8-lts 版本: github: https://github.com/bingcool/library - -### 关联项目 -bingcool/workerfy 是基于swoole实现的多进程协程模型,专处理daemon后台进程处理 -github: https://github.com/bingcool/workerfy - ### 一、安装 1、先配置环境变量 @@ -108,7 +103,7 @@ source /etc/profile ``` ``` -// dockerfile 创建容器的, 可以根据不同环境生成的内置环境变量不同镜像,每个不同的环境镜像可以用在不同环境,代码将通过这个环境变量区分环境,加载不同的配置 +// 如果是通过dockerfile 创建容器的, 可以根据不同环境生成的内置环境变量不同镜像,每个不同的环境镜像可以用在不同环境,代码将通过这个环境变量区分环境,加载不同的配置 ENV SWOOLEFY_CLI_ENV dev ``` @@ -118,7 +113,7 @@ ENV SWOOLEFY_CLI_ENV dev composer create-project bingcool/swoolefy:^4.8.2 myproject ``` -### 二、添加项目入口启动文件,并定义你的项目目录,命名为App +### 二、添加项目入口启动文件cli.php,并定义你的项目目录,命名为App ``` // 在myproject目录下添加cli.php, 这个是启动项目的入口文件 @@ -199,7 +194,9 @@ namespace App\Controller; use Swoolefy\Core\Application; use Swoolefy\Core\Controller\BController; +// 默认生成的IndexController class IndexController extends BController { + public function index() { Application::getApp()->response->write('

Hello, Welcome to Swoolefy Framework!

'); } @@ -212,7 +209,7 @@ class IndexController extends BController { ### 定义组件 -配置文件: +应用层配置文件: Config/config-dev.php 开放式组件接口,闭包回调实现创建组件过程,return对象即可 @@ -333,6 +330,7 @@ return [ 'channel' => 'application', 'logFilePath' => rtrim(LOG_PATH,'/').'/runtime.log' ], + // 或者log组件利用闭包回调创建 'log' => function($name) { $channel= 'application'; @@ -366,8 +364,9 @@ class TestController extends BController { // predis组件 $predis = Application::getApp()->predis; - //或者 + //或者通过get指明组件名获取(推荐) // $predis = Application::getApp()->get('predis'); + // 这个过程会发生协程调度 $predis->set('predis','this is a predis instance'); $predis->get('predis'); @@ -384,7 +383,7 @@ class TestController extends BController { ]); var_dump($numRows) - //查询 + // 查询 $result = $db->createCommand('select * from user where id>:id')->queryOne([':id'=>100]); var_dump($result); @@ -401,6 +400,111 @@ class TestController extends BController { ``` + +### 默认协议层全局配置文件 Protocol/config-dev.php + +开发者可以根据实际使用适当调整配置项 + +``` + $appConf, // 应用层配置 + 'application_index' => '', + 'event_handler' => \Test\Event::class, + 'exception_handler' => \Test\Exception\ExceptionHandle::class, + 'response_formatter' => \Swoolefy\Core\ResponseFormatter::class, + 'master_process_name' => 'php-swoolefy-http-master', + 'manager_process_name' => 'php-swoolefy-http-manager', + 'worker_process_name' => 'php-swoolefy-http-worker', + 'www_user' => '', + 'host' => '0.0.0.0', + 'port' => '9501', + 'time_zone' => 'PRC', + 'swoole_process_mode' => SWOOLE_PROCESS, + 'include_files' => [], + 'runtime_enable_coroutine' => true, + + // swoole setting + 'setting' => [ + 'admin_server' => '0.0.0.0:9503', + 'reactor_num' => 1, + 'worker_num' => 4, + 'max_request' => 10000, + 'task_worker_num' => 2, + 'task_tmpdir' => '/dev/shm', + 'daemonize' => 0, + 'dispatch_mode' => 3, + 'reload_async' => true, + 'enable_coroutine' => 1, + 'task_enable_coroutine' => 1, + // 压缩 + 'http_compression' => true, + // $level 压缩等级,范围是 1-9,等级越高压缩后的尺寸越小,但 CPU 消耗更多。默认为 1, 最高为 9 + 'http_compression_level' => 1, + 'log_file' => '/tmp/' . APP_NAME . '/swoole_log.txt', + 'pid_file' => '/data/' . APP_NAME . '/log/server.pid', + ], + + 'coroutine_setting' => [ + 'max_coroutine' => 50000 + ], + + // 是否内存化线上实时任务 + 'enable_table_tick_task' => true, + + // 内存表定义 + 'table' => [ + 'table_process' => [ + // 内存表建立的行数,取决于建立的process进程数,最小值64 + 'size' => 64, + // 定义字段 + 'fields'=> [ + ['pid','int', 10], + ['process_name','string', 56], + ] + ] + ], + + // 依赖于EnableSysCollector = true,否则设置没有意义,不生效 + 'enable_pv_collector' => false, + 'enable_sys_collector' => true, + 'sys_collector_conf' => [ + 'type' => SWOOLEFY_SYS_COLLECTOR_UDP, + 'host' => '127.0.0.1', + 'port' => 9504, + 'from_service' => 'http-app', + 'target_service' => 'collectorService/system', + 'event' => 'collect', + 'tick_time' => 2, + 'callback' => function () { + $sysCollector = new \Swoolefy\Core\SysCollector\SysCollector(); + return $sysCollector->test(); + } + ], + + // 热更新 + 'reload_conf'=> [ + 'enable_reload' => false, // 是否启用热文件更新功能 + 'after_seconds' => 3, // 检测到只要有文件更新,3s内不在检测,等待重启既可 + 'monitor_path' => APP_PATH, // 开发者自己定义目录 + 'reload_file_types' => ['.php', '.html', '.js'], + 'ignore_dirs' => [], + 'callback' => function () {} + ] +]; + +``` + + ### License MIT Copyright (c) 2017-2023 zengbing huang diff --git a/src/Core/Func/function.php b/src/Core/Func/function.php index 99833a9f..48f540e5 100644 --- a/src/Core/Func/function.php +++ b/src/Core/Func/function.php @@ -142,3 +142,23 @@ function getOneFreePort(array $excludePorts = []): int { return get_one_free_port($excludePorts); } + +/** + * 协程单例 + * + * @param \Closure $callback + * @param ...$params + * @return void + * @throws \Swoolefy\Exception\SystemException + */ +function goApp(\Closure $callback) { + go(function () use($callback) { + (new \Swoolefy\Core\EventApp)->registerApp(function($event) use($callback) { + try { + $callback($event); + }catch (\Throwable $throwable) { + \Swoolefy\Core\BaseServer::catchException($throwable); + } + }); + }); +}