一、简介
EasySwoole 是一款基于Swoole Server 开发的常驻内存型的分布式PHP框架,专为API而生,摆脱传统PHP运行模式在进程唤起和文件加载上带来的性能损失。EasySwoole 高度封装了 Swoole Server 而依旧维持 Swoole Server 原有特性,支持同时混合监听HTTP、自定义TCP、UDP协议,让开发者以最低的学习成本和精力编写出多进程,可异步,高可用的应用服务
官网:https://www.easyswoole.com/
官方文档:https://www.easyswoole.com/Manual/3.x/Cn/_book/
GitHub:https://github.com/easy-swoole/doc
Demo:https://github.com/easy-swoole/demo
特性
强大的 TCP/UDP Server 框架,多线程,EventLoop,事件驱动,异步,Worker进程组,Task异步任务,毫秒定时器,SSL/TLS隧道加密
EventLoop API,让用户可以直接操作底层的事件循环,将socket,stream,管道等Linux文件加入到事件循环中
定时器、协程对象池、HTTP\SOCK控制器、分布式微服务、RPC支持
优势
· 简单易用开发效率高
· 并发百万TCP连接
· TCP/UDP/UnixSock
· 支持异步/同步/协程
· 支持多进程/多线程
· CPU亲和性/守护进程
常用功能与组件
· HTTP控制器与自定义路由
· TCP、UDP、WEB_SOCKET控制器
· 多种混合协议通讯
· 异步客户端与协程对象池
· 异步进程、自定义进程、定时器
· 集群分布式支持,例如集群节点通讯,服务发现,RPC
· 全开放系统事件注册器与EventHook
二、安装和配置
1.环境要求
满足基本的环境要求才能运行框架,easySwoole 框架对环境的要求十分简单,只需要满足运行 Swoole 拓展的条件,并且 PHP 版本在 7.1 以上即可
· 保证 PHP 版本大于等于 7.1
· 保证 Swoole 拓展版本大于等于 4.2.6
· 需要 pcntl 拓展的任意版本
· 使用 Linux / FreeBSD / MacOS 这三类操作系统
· 使用 Composer 作为依赖管理工具
2.安装说明
框架使用 Composer 作为依赖管理工具,在开始安装框架前,请确保已经按上一章节的要求配置好环境并安装好了Composer 工具,在安装过程中,会释放框架的文件到项目目录,请保证项目目录有可写入权限
提示:关于 Composer 的安装可以参照 Composer中国全量镜像(https://pkg.phpcomposer.com/#how-to-install-composer ) 的安装教程,另外 Composer中国 已经很久没有更新了,请大家使用梯子或者是其他镜像。
1)Composer安装
composer require easyswoole/easyswoole=3.x-dev
php vendor/bin/easyswoole.php install
报错处理
在一些环境中,特别是使用集成面板安装的 PHP 环境,会出现以下报错:
dir=$(d=${0%[/\\]*}; cd "$d" > /dev/null; cd '../easyswoole/easyswoole/bin' && pwd)
# See if we are running in Cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
# Cygwin paths start with /cygdrive/ which will break windows PHP,
# so we need to translate the dir path to windows format. However
# we could be using cygwin PHP which does not require this, so we
# test if the path to PHP starts with /cygdrive/ rather than /usr/bin
if [[ $(which php) == /cygdrive/* ]]; then
dir=$(cygpath -m "$dir");
fi
fi
dir=$(echo $dir | sed 's/ /\ /g')
"${dir}/easyswoole" "$@"
关于该问题,搜索了几回谷歌,都说是composer问题。不信执行以下代码也有同样问题
> php vendor/bin/php-parser
暂时解决方案就是用 yum 或者是以手动编译的形式重新安装你的 PHP 环境,或者也可以直接指向easySwoole的脚本,若有解决该报错的方案,请与我联系
# 直接指向easySwoole的管理脚本
php vendor/easyswoole/easyswoole/bin/easyswoole.php install
2)手动安装
按下面的步骤进行手动安装
composer require easyswoole/easyswoole=3.x-dev
php vendor/bin/easyswoole.php install
中途没有报错的话,执行:
# 启动框架
php easyswoole start
此时可以访问 http://localhost:9501 看到框架的欢迎页面,表示框架已经安装成功
提示:如果第二步的 install 操作报错 请查看上方的报错处理
Hello World
在项目根目录下创建如下的目录结构,这个目录是编写业务逻辑的应用目录,编辑 Index.php 文件,添加基础控制器的代码
project 项目部署目录
----------------------------------
├─App 应用目录
│ └─HttpController 应用的控制器目录
│ └─Index.php 默认控制器文件
----------------------------------
<?php namespace App\HttpController; use EasySwoole\Http\AbstractInterface\Controller; class Index extends Controller { function index() { // TODO: Implement index() method. $this->response()->write('hello world'); } } 然后编辑根目录下的 composer.json 文件,注册应用的命名空间 { "autoload": { "psr-4": { "App\\": "App/" } }, "require": { "easyswoole/easyswoole": "3.x-dev" } }
实际上就是注册App的名称空间
最后执行 composer dumpautoload 命令更新命名空间,框架已经可以自动加载 App 目录下的文件了,此时框架已经安装完毕,可以开始编写业务逻辑
# 更新命名空间映射
composer dumpautoload
# 启动框架
php easyswoole start
启动框架后,访问 http://localhost:9501即可看到 Hello World 。
关于IDE助手
由于 Swoole 的函数并不是PHP标准函数,IDE无法进行自动补全,为了方便开发,可以执行以下命令引入IDE助手,在IDE下即可自动补全 Swoole 相关的函数
composer require easyswoole/swoole-ide-helper
示例项目
框架准备了一个示例项目,内有框架大部分功能的示例代码,直接克隆下方的 GitHub 仓库到本地并安装依赖,即可开始体验
仓库地址: https://github.com/easy-swoole/demo/tree/3.x
3.目录结构
EasySwoole 的目录结构是非常灵活的,基本上可以任意定制,没有太多的约束,但是仍然建议遵循下面的目录结构,方便开发
project 项目部署目录
├─App 应用目录(可以有多个)
│ ├─HttpController 控制器目录
│ │ └─Index.php 默认控制器
│ └─Model 模型文件目录
├─Log 日志文件目录
├─Temp 临时文件目录
├─vendor 第三方类库目录
├─composer.json Composer架构
├─composer.lock Composer锁定
├─EasySwooleEvent.php 框架全局事件
├─easyswoole 框架管理脚本
├─easyswoole.install 框架安装锁定文件
├─dev.env 开发配置文件
├─produce.env 生产配置文件
如果项目还需要使用其他的静态资源文件,建议使用 Nginx / Apache 作为前端Web服务,将请求转发至 easySwoole 进行处理,并添加一个 Public 目录作为Web服务器的根目录
注意:请不要将框架主目录作为web服务器的根目录,否则dev.env,produce.env配置将会是可访问的,也可自行排除该文件
4.配置文件
EasySwoole框架提供了非常灵活自由的全局配置功能,配置文件采用PHP返回数组方式定义,对于一些简单的应用,无需修改任何配置,对于复杂的要求,还可以自行扩展自己独立的配置文件和进行动态配置
1)默认配置文件
框架安装完成后系统默认的全局配置文件是项目根目录下的 dev.env,produce.env 文件, 文件内容如下:
# eg: # mysql.port = 3306 # MAIN_SERVER.PORT = 80 # MAIN_SERVER.SETTING.worker_num = 80 ################ defalut config ################## SERVER_NAME = EasySwoole MAIN_SERVER.LISTEN_ADDRESS = 0.0.0.0 MAIN_SERVER.PORT = 9501 MAIN_SERVER.SERVER_TYPE = WEB_SERVER ## 可选为 SERVER WEB_SERVER WEB_SOCKET_SERVER MAIN_SERVER.SOCK_TYPE = SWOOLE_TCP ## 该配置项当为SERVER_TYPE值为SERVER时有效 MAIN_SERVER.RUN_MODEL = SWOOLE_PROCESS MAIN_SERVER.SETTING.task_worker_num = 8 MAIN_SERVER.SETTING.task_max_request = 500 MAIN_SERVER.SETTING.worker_num = 8 MAIN_SERVER.SETTING.max_request = 5000 TEMP_DIR = null LOG_DIR = null 各项目的配置含义如下 MAIN_SERVER - 默认Server配置 LISTEN_ADDRESS - 默认Server监听的地址 PORT - 默认Server监听的端口 SERVER_TYPE - 默认Server的类型 SOCK_TYPE - 默认Server的Sock类型( 仅 SERVER_TYPE 配置为 SERVER 时有效 ) RUN_MODEL - 默认Server的运行模式 SETTING - Swoole Server的运行配置( 完整配置可见Swoole文档 ) task_worker_num - 运行的 task_worker 进程数量 task_max_request - task_worker 完成该数量的请求后将退出,防止内存溢出 worker_num - 运行的 worker 进程数量 max_request - worker 完成该数量的请求后将退出,防止内存溢出 TEMP_DIR - 临时文件存放的目录 LOG_DIR - 日志文件存放的目录
2)配置操作类
配置操作类为 EasySwoole\Config 类,使用非常简单,见下面的代码例子,操作类还提供了 toArray 方法获取全部配置,load 方法重载全部配置,基于这两个方法,可以自己定制更多的高级操作
设置和获取配置项都支持点语法分隔,见下面获取配置的代码例子
<?php $instance = \EasySwoole\EasySwoole\Config::getInstance(); // 获取配置 按层级用点号分隔 $instance->getConf('MAIN_SERVER.SETTING.task_worker_num'); // 设置配置 按层级用点号分隔 $instance->setConf('DATABASE.host', 'localhost'); // 获取全部配置 $conf = $instance->getConf(); // 用一个数组覆盖当前配置项 $conf['DATABASE'] = [ 'host' => '127.0.0.1', 'port' => 13306 ]; $instance->load($conf);
需要注意的是 由于进程隔离的原因 在Server启动后,动态新增修改的配置项,只对执行操作的进程生效,如果需要全局共享配置需要自己进行扩展
添加用户配置项
每个应用都有自己的配置项,添加自己的配置项非常简单,其中一种方法是直接在配置文件中添加即可,如下面的例子
# eg: # mysql.port = 3306 # MAIN_SERVER.PORT = 80 # MAIN_SERVER.SETTING.worker_num = 80 ################ defalut config ################## SERVER_NAME = EasySwoole MAIN_SERVER.LISTEN_ADDRESS = 0.0.0.0 MAIN_SERVER.PORT = 9501 MAIN_SERVER.SERVER_TYPE = WEB_SERVER ## 可选为 SERVER WEB_SERVER WEB_SOCKET_SERVER MAIN_SERVER.SOCK_TYPE = SWOOLE_TCP ## 该配置项当为SERVER_TYPE值为SERVER时有效 MAIN_SERVER.RUN_MODEL = SWOOLE_PROCESS MAIN_SERVER.SETTING.task_worker_num = 8 MAIN_SERVER.SETTING.task_max_request = 500 MAIN_SERVER.SETTING.worker_num = 8 MAIN_SERVER.SETTING.max_request = 5000 TEMP_DIR = null LOG_DIR = null ############## 这里是用户自己的配置 ################## DATABASE.ip=127.0.0.1 DATABASE.port=3306 DATABASE.user=root DATABASE.password=root
也可以新建php或者env文件进行添加配置,例如:
添加App/Conf/web.php和App/Conf/app.env
EasySwooleEvent.php文件写法示例:
<?php /** * Created by PhpStorm. * User: yf * Date: 2018/5/28 * Time: 下午6:33 */ namespace EasySwoole\EasySwoole; use EasySwoole\EasySwoole\Swoole\EventRegister; use EasySwoole\EasySwoole\AbstractInterface\Event; use EasySwoole\Http\Request; use EasySwoole\Http\Response; use EasySwoole\Utility\File; class EasySwooleEvent implements Event { public static function initialize() { self::loadConf(); // TODO: Implement initialize() method. } /** * 加载配置文件 */ public static function loadConf(){ $files = File::scanDirectory(EASYSWOOLE_ROOT.'/Application/Config'); if(is_array($files)){ foreach ($files['files'] as $file) { $fileNameArr= explode('.',$file); $fileSuffix = end($fileNameArr); if($fileSuffix=='php'){ Config::getInstance()->loadFile($file); }elseif($fileSuffix=='env'){ Config::getInstance()->loadEnv($file); } } } } public static function mainServerCreate(EventRegister $register) { // TODO: Implement mainServerCreate() method. } public static function onRequest(Request $request, Response $response): bool { // TODO: Implement onRequest() method. return true; } public static function afterRequest(Request $request, Response $response): void { // TODO: Implement afterAction() method. } public static function onReceive(\swoole_server $server, int $fd, int $reactor_id, string $data):void { } }
env文件不支持#特殊字符配置,可通过此方法,引入php文件
生产与开发配置分离
在php easyswoole start命令下,默认为开发模式,加载dev.env
运行 php easyswoole start produce 命令时,为生产模式,加载produce.env
DI注入配置
es3.x提供了几个Di参数配置,可自定义配置脚本错误异常处理回调,控制器命名空间,最大解析层级等
<?php Di::getInstance()->set(SysConst::ERROR_HANDLER,function (){});//配置错误处理回调 Di::getInstance()->set(SysConst::SHUTDOWN_FUNCTION,function (){});//配置脚本结束回调 Di::getInstance()->set(SysConst::HTTP_CONTROLLER_NAMESPACE,'App\\HttpController\\');//配置控制器命名空间 Di::getInstance()->set(SysConst::HTTP_CONTROLLER_MAX_DEPTH,5);//配置http控制器最大解析层级 Di::getInstance()->set(SysConst::HTTP_EXCEPTION_HANDLER,function (){});//配置http控制器异常回调 Di::getInstance()->set(SysConst::HTTP_CONTROLLER_POOL_MAX_NUM,15);//http控制器对象池最大数量
动态配置
当你在控制器(worker进程)中修改某一项配置时,由于进程隔离,修改的配置不会在其他进程生效,所以我们可以使用动态配置:
动态配置将配置数据存储在swoole_table中,取/修改配置数据时是从swoole_table直接操作,所有进程都可以使用
但是不适合存储大量\大长度的的配置,建议用于开关存储等小数据型数据存储
Config::getInstance()->setDynamicConf('test_config_value', 0);//配置一个动态配置项 $test_config_value_1 = Config::getInstance()->getDynamicConf('test_config_value');//获取一个配置 Config::getInstance()->delDynamicConf('test_config_value');//删除一个配置
三、服务管理脚本
执行完框架安装后,可以在你的项目根目录下,看多一个easyswoole的文件。 执行以下命令:
php easyswoole
可见:
______ _____ _ | ____| / ____| | | | |__ __ _ ___ _ _ | (___ __ __ ___ ___ | | ___ | __| / _` | / __| | | | | \___ \ \ \ /\ / / / _ \ / _ \ | | / _ \ | |____ | (_| | \__ \ | |_| | ____) | \ V V / | (_) | | (_) | | | | __/ |______| \__,_| |___/ \__, | |_____/ \_/\_/ \___/ \___/ |_| \___| __/ | |___/ 欢迎使用为API而生的 easySwoole 框架 当前版本: 3.x 使用: easyswoole [操作] [选项] 操作: install 安装easySwoole start 启动easySwoole stop 停止easySwoole reload 重启easySwoole help 查看命令的帮助信息 有关某个操作的详细信息 请使用 help 命令查看 如查看 start 操作的详细信息 请输入 easyswoole help -start
服务启动
开发模式:
php easyswoole start
守护模式启动
php easyswoole start d
生产环境(默认配置加载dev.env,使用该命令加载produce.env)
php easyswoole start produce
服务停止
php easyswoole stop
注意,守护模式下才需要stop,不然control+c或者是终端断开就退出进程了
重启服务
php easyswoole reload 只重启task进程
php easyswoole reload all 重启task + worker进程
注意,守护模式下才需要reload,不然control+c或者是终端断开就退出进程了,此处为热重启,可以用于更新worker start后才加载的文件(业务逻辑),主进程(如配置文件)不会被重启。
文件热加载
由于 swoole 常驻内存的特性,修改文件后需要重启worker进程才能将被修改的文件重新载入内存中,我们可以自定义Process的方式实现文件变动自动进行服务重载
相关示例请查看
转载请注明: ITTXX.CN--分享互联网 » EasySwoole ——基于Swoole分布式PHP框架快速入门
最后更新:2018-12-17 14:56:15