bingcool/swoolefy

swoolefy 是一个基于 swoole 扩展的 HV 框架,让每个人都能轻松使用它!

安装: 618

依赖: 1

建议者: 0

安全: 0

星星: 513

关注者: 27

分支: 78

开放问题: 2

类型:项目


README

swoolefy 是一个基于 swoole 扩展实现的轻量级高性能的常驻内存型 API 和 Web 应用服务框架,高度封装了 http、websocket、udp 服务器,以及基于 tcp 实现的可扩展的 rpc 服务,同时支持 composer 包方式安装部署项目。基于实用,swoolefy 抽象 Event 事件处理类,实现与底层的回调解耦,支持同步|异步调用,内置 view、log、session、mysql、redis、memcached、mongodb 等常用组件等。

swoolefy 是一个适合学习 swoole 的框架,底层屏蔽了 swoole 与传统 php-fpm 的一些差异,让大部分的 PHPer 使用起来可以像使用 php-fpm 那样,轻松上手。

实现的功能特性

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

开发文档手册

开发文档
demo

swoolefy 官方 QQ 群:735672669,欢迎加入!

配置环境

安装实际环境(建议)

1、支持 php7.0+
2、搭建 lnmp 环境,建议使用 lnmp 一键安装包,https://lnmp.org,建议安装 lnmp1.4
3、安装 php 必要的扩展,本框架需要的扩展包括 swoole(1.9.17+)、swoole_serialize、inotify、pcntl、posix、zlib、mbstring,可以通过 php-m 查看是否安装了这些扩展,如果通过 lnmp1.4 一键安装包安装的,已经默认安装好这四个 pcntl、posix、zlib、mbstring 扩展的,只需要在安装 swoole 和 swoole_serialize、inotify 即可,具体安装过程参考官方文档

docker 容器已经配置好的 php 环境(开发测试)

为了方便开发和测试,我打包了一个基于 alpine 基础镜像搭建的 php7.1 环境容器 bingcool/php2swoole:2.4,这个 image 已经非常小了,已经安装所有的必须扩展,其中 swoole 是 1.10.4 版本,可以通过 php --ri swoole 查看信息。
alpine 的官网:https://pkgs.alpinelinux.org/packages

docker pull bingcool/php2swoole:2.4     

如果需要 swoole4.0.1 版本,可以

docker pull bingcool/php2swoole:4.0.1

已安装的扩展如下:

bz2    
Core    
curl   
date   
fileinfo    
filter    
ftp    
gd    
hash     
imagick    
inotify    
json   
libxml    
mbstring    
mcrypt  
memcached  
mongodb  
mysqlnd   
openssl  
pcntl  
pcre   
PDO   
pdo_mysql  
posix   
readline   
redis   
Reflection   
session   
SimpleXML   
soap    
sockets   
SPL    
standard    
swoole   
swoole_serialize    
xml    
xmlrpc   
Zend OPcache    
zip    
zlib    
[Zend Modules]     
Zend OPcache    

开发部署

1、如果是自己安装的 php 环境(需在 linux 环境下),建议先创建一个伪用户 www,用来执行 worker 进程业务代码

useradd www -d /home/www -s /sbin/nologin

则在某一个 web 目录,例如 /home/www 下,利用 composer 方式来安装部署一个项目
参考开发文档

2、使用 bingcool/php2swoole 容器启动 php 开发环境
下面是简单使用,首先是启动容器

docker run -it -d --name dev -p 9502:9502 -v /home/www/:/home/www/ bingcool/php2swoole:2.4   

-v /home/www/:/home/www/ 是将主机的 /home/www 目录挂载到容器的 /home/www

(1)然后进入容器

docker exec -it dev /bin/sh

容器中已经安装好 composer 和 git 等工具,然后利用 composer 方式来安装部署一个项目,同样参考
参考开发文档

监控程序

1、启动文件自动监控程序,进入项目目录

当前终端启动:php swoolefy start monitor config.php   
守护进程启动:php swoolefy start monitor config.php -d         
停止:php swoolefy stop monitor 9502     

可以在默认配置文件 swoolefy/protocol/monitor/config.php 设置。监控程序自动监控 php 的文件变动,然后 swoole 的 worker 自动重启,这个文件其实是通过调用代码 Shell 文件的 swoole_monitor.sh 来监控 9502 端口(例如这里 9502 是 swoole 的 http 服务的默认端口)。
当我们需要监听多个不同端口的服务时,可以复制 config.php,命名成不同的配置文件,例如要监听 websocket 的服务端口 9503,那么可以定义配置文件 websocket9503.php,那么此时可以设置

当前终端启动:php swoolefy start monitor websocket9503.php   
守护进程启动:php swoolefy start monitor websocket9503.php -d         
停止:php swoolefy stop monitor 9503

需要注意的是,由于在容器中/home/www 的目录是挂载于主机的,inotify 无法监听到文件变动的,所以这个监控程序在容器环境中是无效的,每次修改代码必须重启

http 服务

2、启动 swoole 的 http 服务,进入项目目录

启动:php swoolefy start http  
守护进程启动:php swoolefy start http -d            
停止:php swoolefy stop http 

默认端口是 9502,可以在配置文件 protocol/http/config.php 中更改,同时对应的 protocol/monitor/config.php 中对应更改端口,实现不同的自动重载。
注意文件权限问题

websocket 服务

1、启动 swoole 的 websocket 服务,进入项目目录

启动:php swoolefy start websocket 
守护进程启动:php swoolefy start websocket -d            
停止:php swoolefy stop websocket      

默认端口 9503,可以在配置文件 protocol/websocket/config.php 中更改

rpc 服务

1、启动 swoole 的 rpc 服务,进入项目目录

启动:php swoolefy start rpc     
守护进程启动:php swoolefy start rpc -d        
停止:php swoolefy stop rpc

默认端口 9504,可以在配置文件 protocol/rpc/config.php 中更改。

udp 服务

1、启动 swoole 的 rpc 服务,进入项目目录

启动:php swoolefy start udp    
守护进程启动:php swoolefy start udp -d     
停止:php swoolefy stop udp

默认端口 9505,可以在配置文件 protocol/udp/config.php 中更改。

访问 Index

在 App/Controller 中就可以编码测试,基本和 thinkphp 的 mvc 那样操作。 比如在 App/Controller/IndexController.php

<?php
namespace App\Controller;

use Swoolefy\Core\Application;
use Swoolefy\Core\Controller\BController;

class IndexController extends BController {

    public function index() {
        $this->response->end('hello word!');
    }

}

那么直接在浏览器输入 http://ip:9502/Index/index
若需要渲染模板

<?php
namespace App\Controller;

use Swoolefy\Core\Application;
use Swoolefy\Core\Controller\BController;

class IndexController extends BController {

    public function index() {
        $this->assign('name','hello word!');
        $this->display('index.html');

}

对应的路由规则

controller/action 

如果存在 module 模块

module/controller/action

具体的可以参考 App/Controller/ 的 demo

如果需要使用 mysql、redis、mongodb 这些组件功能,请安装对应的扩展和服务,并在 App/Config/config.php 中配置。这个与 Yii2 的 Component 相似。

nginx 代理

为了使用更好支持的 HTTP 协议,建议前端使用 nginx 作为代理,更多功能可以看 proxy 模块来设置

location / {
            proxy_http_version 1.1;
            proxy_set_header Connection "keep-alive";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://127.0.0.1:9502;
        }

许可证

MIT