EasySwoole
是一款基于 Swoole Server
开发的常驻内存型的分布式PHP框架,专为API而生,摆脱传统PHP运行模式在进程唤起和文件加载上带来的性能损失。 EasySwoole 高度封装了 Swoole Server 而依旧维持 Swoole Server 原有特性,支持同时混合监听HTTP、自定义TCP、UDP协议
环境 满足基本的环境要求才能运行框架,easySwoole 框架对环境的要求十分简单,只需要满足运行 Swoole 拓展的条件,并且 PHP 版本在 7.1 以上即可
基础运行环境
保证 PHP 版本大于等于 7.1
保证 Swoole 拓展版本大于等于 4.4.0
需要 pcntl 拓展的任意版本
使用 Linux / FreeBSD / MacOS 这三类操作系统
使用 Composer 作为依赖管理工具
建议使用 Ubuntu14 / CentOS 7.0 或更高版本操作系统
安装 Composer 安装 1 2 composer require easyswoole/easyswoole=3 .x php vendor/bin/easyswoole install
使用 启动框架 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 php easyswoole start [root@caoxl easy_swoole] ______ _____ _ | ____| / ____| | | | |__ __ _ ___ _ _ | (___ __ __ ___ ___ | | ___ | __| / _` | / __| | | | | \___ \ \ \ /\ / / / _ \ / _ \ | | / _ \ | |____ | (_| | \__ \ | |_| | ____) | \ V V / | (_) | | (_) | | | | __/ |______| \__,_| |___/ \__, | |_____/ \_/\_/ \___/ \___/ |_| \___| __/ | |___/ main server SWOOLE_WEB listen address 0.0 .0.0 listen port 9500 ip@eth0 172.18 .52.244 ip@docker0 172.17 .0.1 ip@br-4 ee5fb2568a1 172.19 .0.1 worker_num 8 task_worker_num 8 reload_async 1 task_enable_coroutine 1 max_wait_time 3 pid_file /var /www/easy_swoole/Temp/pid.pid log_file /var /www/easy_swoole/Log/swoole.log daemonize 1 run at user root daemonize true swoole version 4.3 .4 php version 7.2 .7 easy swoole 3.2 .5 develop/produce develop temp dir /var /www/easy_swoole/Temp log dir /var /www/easy_swoole/Log
Hello World 在项目根目录下创建如下的目录结构,这个目录是编写业务逻辑的应用目录,编辑 Index.php
文件,添加基础控制器的代码
1 2 3 4 5 6 project 项目部署目录 ---------------------------------- ├─App 应用目录 │ └─HttpController 应用的控制器目录 │ └─Index.php 默认控制器文件 ----------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php namespace App \HttpController ;use EasySwoole \Http \AbstractInterface \Controller ;class Index extends Controller { function index ( ) { $this ->response ()->write ('hello world' ); } }
然后编辑根目录下的 composer.json
文件,注册应用的命名空间
1 2 3 4 5 6 7 8 9 10 { "autoload" : { "psr-4" : { "App\\" : "App/" } } , "require" : { "easyswoole/easyswoole" : "3.x" } }
最后执行 composer dumpautoload
命令更新命名空间,框架已经可以自动加载 App 目录下的文件了,此时框架已经安装完毕,可以开始编写业务逻辑
1 2 3 4 composer dumpautoload php easyswoole start
启动框架后,访问 http://localhost:9500
即可看到 Hello World
。
目录结构 EasySwoole 的目录结构是非常灵活的,基本上可以任意定制,没有太多的约束,但是仍然建议遵循下面的目录结构,方便开发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 EasySwoole 项目部署目录 ├─App 应用目录(可以有多个) │ ├─HttpController 控制器目录 │ │ └─Index.php 默认控制器 │ └─Model 模型文件目录 ├─Log 日志文件目录 ├─Temp 临时文件目录 ├─vendor 第三方类库目录 ├─composer.json Composer架构 ├─composer.lock Composer锁定 ├─EasySwooleEvent.php 框架全局事件 ├─easyswoole 框架管理脚本 ├─easyswoole.install 框架安装锁定文件 ├─dev.php 开发配置文件 └─produce.php 生产配置文件
框架生命周期
服务管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 php easyswoole start php easyswoole start d php easyswoole start produce php easyswoole reload php easyswoole reload all php easyswoole stop
基础使用 EasySwoole 有着默认的5个命令:
1 2 3 4 5 php easyswoole help 命令帮助 php easyswoole install 安装 php easyswoole start 启动 php easyswoole stop 停止(需要守护进程) php easyswoole reload 热重启(需要守护进程)
自定义命令
新建文件 App/Command/Test.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php namespace App \Command ;use EasySwoole \EasySwoole \Command \CommandInterface ;use EasySwoole \EasySwoole \Command \Utility ;class Test implements CommandInterface { public function commandName ( ) : string { return 'test' ; } public function exec (array $args ) : ? string { var_dump ($args ); echo 'test' . PHP_EOL; return null ; } public function help (array $args ) : ? string { $logo = Utility ::easySwooleLog (); return $logo . "this is test" ; } }
新增 /bootstrap.php
文件:
1 2 3 <?php \EasySwoole\EasySwoole\Command\CommandContainer ::getInstance ()->set (new \App\Command\Test ());
1 2 3 4 5 6 7 8 9 10 [root@caoxl easy_swoole] ______ _____ _ | ____| / ____| | | | |__ __ _ ___ _ _ | (___ __ __ ___ ___ | | ___ | __| / _` | / __| | | | | \___ \ \ \ /\ / / / _ \ / _ \ | | / _ \ | |____ | (_| | \__ \ | |_| | ____) | \ V V / | (_) | | (_) | | | | __/ |______| \__,_| |___/ \__, | |_____/ \_/\_/ \___/ \___/ |_| \___| __/ | |___/ this is test
自定义进程 处理耗时任务,比如处理死循环队列消费,清除多余redis中的token数据等等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?php namespace App \Process ;use EasySwoole \Component \Process \AbstractProcess ;class Process extends AbstractProcess { protected function run ($arg ) { var_dump ($this ->getProcessName () . " run" ); var_dump ($arg ); } protected function onPipeReadable (\Swoole\Process $process ) { } protected function onShutDown ( ) { } protected function onException (\Throwable $throwable , ...$args ) { } }
我们在 EasySwoole
全局的 mainServerCreate
事件中进行进程注册
1 2 3 4 5 6 7 8 9 10 11 use App \Process \Process ;use EasySwoole \Component \Process \Config ;$processConfig = new Config ();$processConfig ->setProcessName ('testProcess' );$processConfig ->setArg ([ 'arg1' =>time () ]); ServerManager ::getInstance ()->getSwooleServer ()->addProcess ((new Process ($processConfig ))->getProcess ());
自定义事件 easyswoole
中,通过Container
容器可实现自定义事件功能
新增 App/Event/Event.php
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php namespace App \Event ;use EasySwoole \Component \Container ;use EasySwoole \Component \Singleton ;class Event extends Container { use Singleton ; function set ($key , $item ) { if (is_callable ($item )) { return parent ::set ($key , $item ); } else { return false ; } } function hook ($event , ...$arg ) { $call = $this ->get ($event ); if (is_callable ($call )) { return call_user_func ($call , ...$arg ); } { return null ; } } }
在框架的 initialize
事件中进行注册事件:
1 2 3 4 5 6 7 8 public static function initialize ( ) { date_default_timezone_set ('Asia/Shanghai' ); \App\Event\Event ::getInstance ()->set ('test' , function () { echo 'test event' ; }); }
1 Event ::getInstance ()->hook ('test' );