swoolefy是一个基于swoole实现的轻量级高性能的常驻内存型的协程级应用服务框架

Overview

swoolefy

  ______                                _           _ _ _ _
 /  ____|                              | |         |  _ _ _|  _   _
|  (__     __      __   ___     ___    | |   ___   | |       | | | |
 \___  \   \ \ /\ / /  / _ \   / _ \   | |  / _ \  | |_ _ _  | | | |
 ____)  |   \ V  V /  | (_) | | (_) |  | | | ___/  |  _ _ _| | |_| |
|_____ /     \_/\_/    \___/   \___/   |_|  \___|  | |        \__, |
                                                   |_|           | |
                                                              __ / |
                                                             |_ _ /

swoolefy是一个基于swoole实现的轻量级高性能的常驻内存型的协程级应用服务框架, 高度支持httpApi,websocket,udp服务器,以及基于tcp实现可扩展的rpc服务, 同时支持composer包方式安装部署项目。基于实用,swoolefy抽象Event事件处理类, 实现与底层的回调的解耦,支持协程调度,同步|异步调用,全局事件注册,心跳检查,异步任务,多进程(池),连接池等, 内置view、log、session、mysql、redis、mongodb等常用组件等。

目前swoolefy4.2+版本完全支持swoole4.4.+的协程,推荐使用新版swoole4.8+.

实现的功能特性

  • 架手脚一键创建项目
  • 路由与调度,MVC三层,多级配置
  • 支持composer的PSR-4规范,实现PSR-3的日志接口
  • 支持自定义注册不同根命名空间,快速多项目部署
  • 支持httpServer,实用轻量Api接口开发
  • 支持websocketServer,udpServer,mqttServer
  • 支持基于tcp实现的rpc服务,开放式的系统接口,可自定义协议数据格式,并提供rpc-client协程组件
  • 支持DI容器,组件IOC、配置化
  • 支持协程单例注册,协程上下文变量寄存
  • 支持mysql、postgreSql协程组件、redis协程组件、mongodb组件
  • 支持mysql的协程连接池,redis协程池
  • 支持protobuf buffer的数据接口结构验证,压缩传输等
  • 异步务管理TaskManager,定时器管理TickManager,内存表管理TableManager
  • 自定义进程管理ProcessManager,进程池管理PoolsManger
  • 支持底层异常错误的所有日志捕捉,支持全局日志,包括debug、info、notice、warning、error等级
  • 支持自定义进程的redis,rabitmq,kafka的订阅发布,消息队列等
  • 支持crontab计划任务
  • 支持热更新reload worker
  • 支持定时的系统信息采集,并以订阅发布,udp等方式收集至存贮端
  • 命令行形式高度封装启动|停止控制的脚本,简单命令即可管理整个框架
  • 分布式服务注册(zk,etcd)

常用组件

组件名称 安装 说明
predis composer require predis/predis:~1.1.7 predis组件、或者Phpredis扩展
mongodb composer require mongodb/mongodb:~1.3 mongodb组件,需要使用mongodb必须安装此组件
rpc-client composer require bingcool/rpc-client:dev-master swoolefy的rpc客户端组件,当与rpc服务端通信时,需要安装此组件,支持在php-fpm中使用
cron-expression composer require dragonmantank/cron-expression crontab计划任务组件,类似Linux的crobtab
redis lock composer require malkusch/lock Redis锁组件
validate composer require vlucas/valitron validate数据校验组件
bingcool/library composer require bingcool/library library组件库

bingcool/library 是swoolefy require 内置库,专为swoole协程实现的组件库

实现了包括:

  • Db Mysql Model组件
  • PostgreSql Model组件
  • Kafka Producer Consumer组件
  • Redis Cache组件
  • Redis Queue队列组件
  • Redis Delay Queue延迟队列组件
  • RedisLock锁组件
  • RateLimit限流组件
  • Redis Public Subscribe组件
  • Db 、Redis、Curl协程连接池组件
  • UUid 自增id组件
  • Curl基础组件

github: https://github.com/bingcool/library

关联项目

bingcool/workerfy 是基于swoole实现的多进程协程模型,专处理daemon后台进程处理
github: https://github.com/bingcool/workerfy

定义组件,开放式组件接口,闭包回调实现创建组件过程,return对象即可


// db|redis连接池

'enable_component_pools' => [
    // 取components的`DB`组件名称相对应
    'db' => [
        'pools_num' => 5, // db实例数
        'push_timeout' => 2, // db实例进入channel池最长等待时间,单位s
        'pop_timeout' => 1, // db实例出channel池最长等待时间,单位s.在规定时间内获取不到db对象,将降级为实时创建db实例
        'live_time' => 10 // db实例的有效期,单位s.过期后将被掉弃,重新创建新DB实例
    ],

    // 取components的`redis`组件名称相对应
    'redis' => [
        'pools_num' => 5,
        'push_timeout' => 2,
        'pop_timeout' => 1,
        'live_time' => 10
    ]
],

// 在应用层配置文件中,例如下面使用library的Redis、Db组件

components => [
    // 例如创建phpredis扩展连接实例
    'redis' => function($com_name) { // 定义组件名,闭包回调实现创建组件过程,return对象即可
         $redis = new \Common\Library\Cache\Redis();
         $redis->connect('127.0.0.1', 6379);
         $redis->auth('123456789');
         return $redis;   
    },

    // predis组件的redis实例
    'predis' => function($name) {
        $parameters = [
            'scheme' => 'tcp',
            'host'   => '127.0.0.1',
            'port'   => 6379,
            'password' => '123456789'
        ];
        $predis = new \Common\Library\Cache\Predis();
        $predis->setConfig($parameters);
        return $predis;
    },

     // 适配swoole的mysql客户端组件
    'db' => function() {
        $config = [
            // 地址
            'hostname'        => '127.0.0.1',
            // 数据库
            'database'        => 'bingcool',
            // 用户名
            'username'        => 'bingcool',
            // 密码
            'password'        => '123456789',
            // 端口
            'hostport'        => '3306',
            // dsn
            'dsn'             => '',
            // 数据库连接参数
            'params'          => [],
            // 数据库编码,默认采用utf8
            'charset'         => 'utf8',
            // 数据库表前缀
            'prefix'          => '',
            // 是否断线重连
            'break_reconnect' => true,
            // 是否支持事务嵌套
            'support_savepoint' => false
        ];

        $db = new \Common\Library\Db\Mysql($config);
        return $db;
    },
       
    // 适配swoole的postgreSql客户端组件
    'pg' => function() {
        $config = [
            // 地址
            'hostname'        => '127.0.0.1',
            // 数据库
            'database'        => 'dbtest',
            // 用户
            'username'        => 'bingcool',
            // 密码
            'password'        => '123456789',
            // 端口
            'hostport'        => '5432',
            // dsn
            'dsn'             => '',
            // 数据库连接参数
            'params'          => [],
            // 数据库编码,默认采用utf8
            'charset'         => 'utf8',
            // 数据库表前缀
            'prefix'          => '',
            // 是否断线重连
            'break_reconnect' => true,
            // 是否支持事务嵌套
            'support_savepoint' => false
        ];

        $pg = new \Common\Library\Db\Pgsql($config);
        return $pg;
    },

    // 其他的组件都可以通过闭包回调创建
    // 数组配置型log组件
    'log' => [
        'class' => \Swoolefy\Util\Log::class,
        'channel' => 'application',
        'logFilePath' => rtrim(LOG_PATH,'/').'/runtime.log'
    ],
    // 或者log组件利用闭包回调创建
    'log' => function($name) {
        $channel= 'application';
        $logFilePath = rtrim(LOG_PATH,'/').'/runtime.log';
        $log = new \Swoolefy\Util\Log($channel, $logFilePath);
        return $log;
    },
]

使用组件

createCommand($sql)->insert([ ':username'=>'bingcool-test', ':sex' => 1 ]); var_dump($numRows) //查询 $result = $db->createCommand('select * from user where id>:id')->queryOne([':id'=>100]); var_dump($result); // pg实例 $pg = Application::getApp()->get('pg'); // 添加一条数据 $sql = "INSERT INTO `user` (username ,sex) VALUES (:username, :sex)"; $pg->createCommand($sql)->insert([ ':username'=>'bingcool-test', ':sex' => 1 ]); } } ">
use Swoolefy\Core\Application;
class TestController extends BController {
    /**
    * 控制器
    */
    public function test() {
        // 获取组件,组件就是配置回调中定义的组件
        $redis = Application::getApp()->redis;
        //或者通过get指明组件名获取(推荐)
        // $redis = Application::getApp()->get('redis');

        // swoole hook 特性,这个过程会发生协程调度
        $redis->set('name', swoolefy);

        // predis组件
        $predis = Application::getApp()->predis;
        //或者
        // $predis = Application::getApp()->get('predis');
        // 这个过程会发生协程调度
        $predis->set('predis','this is a predis instance');
        $predis->get('predis');
        
        // PDO的mysql实例,这个过程会发生协程调度
        $db = Application::getApp()->db;
        // 或者
        // $mysql = Application::getApp()->get('db');
        // 添加一条数据
        $sql = "INSERT INTO `user` (`username` ,`sex`) VALUES (:username, :sex)"; 
        $numRows = $db->createCommand($sql)->insert([
            ':username'=>'bingcool-test',
            ':sex' => 1
        ]);
        var_dump($numRows)         

        //查询
        $result = $db->createCommand('select * from user where id>:id')->queryOne([':id'=>100]);
        var_dump($result);    

        // pg实例    
        $pg = Application::getApp()->get('pg');   
        // 添加一条数据   
        $sql = "INSERT INTO `user` (username ,sex) VALUES (:username, :sex)"; 
        $pg->createCommand($sql)->insert([
            ':username'=>'bingcool-test',
            ':sex' => 1
        ]);
    }
}

开发文档手册

文档:开发文档
swoolefy官方QQ群:735672669,欢迎加入!

License

MIT
Copyright (c) 2017-2020 zengbing huang

You might also like...
Comments
  • 初始化兼容问题

    初始化兼容问题

    在不使用docker的情况下,mac系统不能兼容swoolefy的初始化安装(php swoolefy start App -dev); 会报一些错,比如:mac系统的进程是不能重命名的,所以swoole_set_process_name的就需要判断一下系统才能执行,不然会报错; 又比如:不能在/dev/目录下创建新目录(我直接sudo mkdir也不可以创建),执行开始命令时也会报错; docker没去尝试过,不知道以后有时间能不能尝试做下兼容(嘿嘿,刚觉swoolefy挺适合swoole初学者的); 另外请教下,我是swoole新手,网上各类文章和例子都看了不少,也在一些php框架尝试使用了基础功能,但是总觉得缺少一些什么(感觉是在实际项目中要怎么嵌入swoole的使用,具体是什么挺模糊的,不知道兄弟们能明白我的这种感受吗?哈哈哈) 感谢指教!!!

    opened by Mecyu 1
  • 按照文档一步步操作就 报错了

    按照文档一步步操作就 报错了

    文档 : https://www.kancloud.cn/bingcoolhuang/php-swoole-swoolefy/587504

    php 7.2.18
    swoole 4.4.12

    composer update 安装完成之后 按照文档创建

    报错: [root@none swoolefy]# php swoolefy create App #! /usr/bin/php PHP Warning: require(/data/www/swoolefy/vendor/composer/../bingcool/swoolefy/score/core/Func/function.php): failed to open stream: No such file or directory in /data/www/swoolefy/vendor/composer/autoload_real.php on line 66

    Warning: require(/data/www/swoolefy/vendor/composer/../bingcool/swoolefy/score/core/Func/function.php): failed to open stream: No such file or directory in /data/www/swoolefy/vendor/composer/autoload_real.php on line 66 PHP Fatal error: require(): Failed opening required '/data/www/swoolefy/vendor/composer/../bingcool/swoolefy/score/core/Func/function.php' (include_path='.:/data/server/php/lib/php') in /data/www/swoolefy/vendor/composer/autoload_real.php on line 66

    Fatal error: require(): Failed opening required '/data/www/swoolefy/vendor/composer/../bingcool/swoolefy/score/core/Func/function.php' (include_path='.:/data/server/php/lib/php') in /data/www/swoolefy/vendor/composer/autoload_real.php on line 66

    opened by dafa168 0
  • Centos 下大小写问题 bingcool/swoolefy-zipkin/src/ZipkinTracer.php

    Centos 下大小写问题 bingcool/swoolefy-zipkin/src/ZipkinTracer.php

    [linjinyu@localhost project]$ php swoolefy start http PHP Fatal error: Class 'whitemerry\phpkin\tracer' not found in /mnt1t/__source_code__/__swoole__/project/vendor/bingcool/swoolefy-zipkin/src/ZipkinTracer.php on line 7

    `<?php namespace zipkin;

    use whitemerry\phpkin\tracer; use whitemerry\phpkin\TracerInfo;

    class ZipkinTracer extends tracer {

    /**
     * Save trace
     */
    public function trace($is_async = false)
    {
        if (!TracerInfo::isSampled()) {
            return;
        }
    
        $unsetParentId = true;
        if ($this->profile === static::BACKEND && !$this->unsetParentIdForBackend) {
            $unsetParentId = false;
        }
    
        $this->addTraceSpan($unsetParentId);
    
        if($is_async) {
        	$this->logger->asyncTrace($this->spans);
        }else {
        	$this->logger->trace($this->spans);
        }
    }
    

    }`

    use whitemerry\phpkin\tracer; 2 use whitemerry\phpkin\Tracer;

    opened by rain16881 0
  • 开源不易,且行且珍惜。感谢不断奋斗在开源路上的人。

    开源不易,且行且珍惜。感谢不断奋斗在开源路上的人。

    其实一直想吐槽 php 几点:

    1. 拓展安装麻烦:我们之前开源了一套 php 框架,结果很多人死在拓展安装上,要么 phpize 要么 pecl 。。。windows 系统的也各种麻烦。
      而node 版本的, npm install 都好了。
    2. 很多 phper —— 培训班水平,composer 都不会用。
    3. swoole 生态不健全,对于企业来说,成本太高。

    这个项目还是让我看到了 swoole 的希望~

    可惜我们最后还是从 php 转向了 node ~

    opened by zuohuadong 0
Releases(v5.0.1)
  • v5.0.1(Nov 26, 2022)

  • v4.8.1(Nov 26, 2022)

  • 4.3.1(Jul 4, 2020)

  • 4.3.0(Jun 14, 2019)

    • fixed bug of RedisCoroutine组件,在组件创建时支持回调设置
    • 优化MysqlCoroutine组件,更加轻量级,在组件创建时支持回调设置
    • 优化HttpRoute的not_found_handler的处理
    • 优化_afterAction()函数处理
    • 新增应用实例获取组价--get()函数获取组价实例,性能更好
    • 优化其他底层的细节,提升性能,不影响使用
    • 移除一些swoole已不支持的过时的异步API
    Source code(tar.gz)
    Source code(zip)
  • 4.2.3(May 25, 2019)

    本版本主要是优化redis,mysql的协程连接池

    • redis,mysql协程连接池加入调用次数矫正,防止极端情况下的超调用
    • task进程,自定义process进程支付redis,db协程连接池
    • 优化协程池管理,添加闭包创建强制返回实现PoolsHandler对象类型
    • coroutinePools的redis,mysql对象使用完后重新入channel协程池,push实现协程模式,不影响主流程
    Source code(tar.gz)
    Source code(zip)
  • 4.2.2(May 19, 2019)

    • 优化自动加载autoloader,设置缓存,提升性能
    • 底层重构redis,db的协程池,以及容错降级处理,接口统一使用
    • 重新支持RPC对Text协议的支持
    • 添加类似go的waitGroup的GoWaitGroup处理类
    • 优化http request is finished的警告
    • 修复TaskService的bug
    • 修复在同域内redirect报错问题
    Source code(tar.gz)
    Source code(zip)
  • 4.2.1(Apr 19, 2019)

  • 4.2.0(Apr 14, 2019)

    • 添加全局日志处理组件
    • 修复应用EventController的__controuct的协程覆盖问题,使用defer替代
    • 优化全局异常捕捉
    • 优化热更新和Model的构造参数传入
    • 控制脚本添加一键创建应用目录
    • 修复了在创建多协程实例的情况下可能存在的对象污染
    • 添加协程单例的入口函数方法的限制,只能调用一次
    • 修复Tick的协程单例执行完的变量销毁
    • 优化managerStop事件监听
    • 优化httpRoute处理
    • 修复session组件在某些情况下setcookie失败
    • 底层区分Event的事件处理与MainEvent
    • 添加限制task任务类使用范围
    • 兼容task_enable_coroutine的异步任务
    • 支持配置回调自定义创建组件单例,给与开发者更大自由
    • 添加环境变量host_ip的启动参数设计,并优化部分细节
    • 移除异步redis客户端,使用协程redis客户端,以兼容新版swoole4.3
    • 修复部分bug
    Source code(tar.gz)
    Source code(zip)
  • 4.1.2(Feb 14, 2019)

    • 修复processManager支持自定义进程reboot,poolsManager支持poolsProcess的reboot。之前只能在process中reboot
    • 优化AbstractProcess和AbstractProcessPools的getPid()的方式,从table内存中获取。
    • 优化控制脚本
    • fixed关于原生redis协程的setOptions()的bug
    • 添加try的finally处理
    • 解耦rpc,websocket,udp服务的异步任务
    • 规范注释
    Source code(tar.gz)
    Source code(zip)
  • 4.1.1(Jan 17, 2019)

  • 4.1.0(Jan 6, 2019)

    • 重构db,redis的连接池,为每个worker可以fork一个对应的addprocess,专门为worker服务,兼容最新版的swoole
    • 修复了predis的长连接情况下的断线
    • 优化boollean变量的过滤
    Source code(tar.gz)
    Source code(zip)
  • 4.0.8(Jan 5, 2019)

    • 优化了http_route
    • 优化regiseterApp实例注册方法
    • 优化boollean变量的过滤
    • 优化mysql的swoolefy-orm组件,更好适配swoole环境
    • 修复predis长连接断开问题
    • 最高只支持swoole4.2.9
    Source code(tar.gz)
    Source code(zip)
  • 4.0.7(Dec 2, 2018)

    • 将应用层寄存在整个服务生命周期中,之前寄存在每次的访问生命周期
    • 废弃 swoole_serialize 以便兼容php7.3,使用serialize替换
    • 重构swoolefy的控制脚本文件,现支持多应用创建,互相隔离
    • 添加了环境判断dev,gra,prd,启动时自动加载不同环境的配置
    • 重构协程单例应用注册支持投递闭包
    • 限制要求支持php7.1+,swoole4.2.x+以上,删除部分没用过时代码以及优化一些细节
    Source code(tar.gz)
    Source code(zip)
  • 4.0.6(Nov 25, 2018)

    swoolefy4.0.6版本,主要一些变更:

    • 添加自定义进程捕捉异常和错误
    • 优化进程判断,区分worker进程,task进程,自定义process进程
    • 修复processPools下Process::signal(SIGCHLD)信号的覆盖问题
    • 修复mysql协程单体实例的afterRequest的释放
    • 规范返回的报错log和注释规范
    • 适配swoolefy-orm组件支持swoole的协程环境
    Source code(tar.gz)
    Source code(zip)
  • 4.0.5(Nov 9, 2018)

    • 优化了极端条件下因报错或者异常退出造成可能出现的内存溢出
    • 优化crontab定时任务进程组件
    • 修复sysCollector的采集问题和优化pv请求计数器
    • 优化http的post数据获取
    • core中移除rpc-client,作为独立composer组件-bingcool/rpc-client
    • 添加配置选项“runtime_enable_coroutine”,一键协程动态启用Coroutine
    • 修复部分已知bug,优化部分细节
    • 支持最高swoole4.2.6版本,php7.2+版本
    Source code(tar.gz)
    Source code(zip)
  • 4.0.3(Oct 21, 2018)

    1、支持tick回调,crontab回调 2、支持自定义进程处理的publish,subscribe,消息队列 3、支持系统信息采集进程,开放接口 4、修复已知若干bug 5、最高版本基于swoole4.2.1开发,兼容swoole4.x-4.2.1版本,包含4.2.1

    Source code(tar.gz)
    Source code(zip)
  • 4.0.2(Aug 3, 2018)

    • 添加支持mysql,redis组件的连接池,由一个或者多个process专门负责创建mysql(包括协程),redis实例(包括协程)push至channel中,worker进程中直接可以从channel中pop使用。
    • 添加pools的管理,可以方便管理各个连接池的使用情况。
    • 预留开放式的接口类,开发者可以根据自己的调度智能创建mysql,redis实例。
    • 优化其他方面的性能,修复一些已知的bug。
    Source code(tar.gz)
    Source code(zip)
  • 4.0.1(Jul 31, 2018)

    • 基于thinkphp-orm实现的swoolefy-orm支持mysql协程客户端组件,方便使用
    • 支持实现基于swoole原生协程redis的RedisCoroutine的协程客户端组件,方便使用
    • 优化Component组件的callback回调函数
    • 优化了ZModel的单例模式,支持可变参数,灵活不同model类的使用
    • 优化http的get,post参数获取方式
    • 修复一些已知bug
    Source code(tar.gz)
    Source code(zip)
  • 4.0.0(Jul 19, 2018)

    • swoolefy4.0.0将与swoole4.x版本相对应,更好区分版本之间的差异。
    • swoolefy4.0版本重构底层核心部分,全面支持构建协程实例对象池,支持swoole4.x的协程,并兼容swoole的1.x,2.x的非协程模式,推荐使用swoole4.x。
    • 完善全局事件应用实例注册器,可以方便注册应用
    • 修复若干已知的bug,兼容php7.2
    Source code(tar.gz)
    Source code(zip)
  • 1.0.6(Jun 11, 2018)

    • 添加RpcClientManager管理器,可以方便的注册client服务实例,支持单sock连接(或者多socket连接)阻塞调用,单sock连接(或者多sock连接)并行调用,同时RpcClientManager可以在apache|php-fpm中使用
    • RPC的服务端和RPC的客户端支持多种方式获取整包数据,包头,包体
    • RPC配置服务化,简单配置服务即可快速搭建一个RPC的服务器和对应的RPC的服务端
    • 组件实例化支持配置闭包回调函数
    Source code(tar.gz)
    Source code(zip)
  • 1.0.5(May 21, 2018)

  • 1.0.3(May 16, 2018)

    • 优化了自动热重启,设置可以配置过滤不需要检查的文件夹vendor
    • 优化了异步进程任务完成后的finish函数,退至worker进程
    • 修复了部分bug
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(May 11, 2018)

  • 1.0.1(Apr 28, 2018)

  • 1.0.0(Apr 27, 2018)

    1.0.0作为第一个正式版本,主要是在RC1的版本上,进行优化。 1、优化Exception管理,开放系统接口形式,由用户自定义处理异常信息。 2、优化监控程序,可以监控多个服务 3、规范一些命名和注释

    Source code(tar.gz)
    Source code(zip)
  • RC1(Apr 26, 2018)

    本版本不再开发新功能,将聚焦测试以及性能提升,bug修复等 核心特性: 1、轻量级的框架,实现路由与调度,MVC三层,当然也可以配置多层 2、支持composer的PSR-4规范和实现自定义注册命名空间 3、支持多协议,目前支持http,websocket,tcp,udp,以及基于tcp实现的rpc,开放式的系统接口,可自定义协议数据格式 4、抽象Event的事件处理与底层的事件监听解耦,屏蔽不同协议之间的应用差异,大部分代码实现共用 5、实现超全局变量,IOC,静态延迟绑定,组件服务常驻内存化,trait的多路复用,钩子事件,单例,工厂模式等 6、简单易用的异步务管理TaskManager, 定时器管理TickManager, 内存表管理TableManager, 进程管理ProcessManager,超全局管理 7、灵活多层的配置,配置参数即可实现底层已封装的复杂功能 8、应用对象的深度复制,实现对象的常驻内存,每个请求只需要从内存中复制应用对象,不需要再重新创建,减少IO消耗 9、封装View,Log,Mysql,Redis,Mongodb,Swiftmail,Session等常用组件,其他组件根据业务按照约定即可封装成组件 10、实现异步半阻塞与全异步非阻塞,EventHander与底层解耦 11、基于inotify实现自动监控swoole服务的文件变动,实现worker自动reload,智能邮件通知 12、命令行形式高度封装启动|停止控制的脚本,简单命令即可管理整个框架

    Source code(tar.gz)
    Source code(zip)
Owner
黄增冰
do myself better
黄增冰