欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

文摘  EasySwoole ——基于Swoole分布式PHP框架快速入门

PHP框架 本站 2132 0评论

一、简介


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的方式实现文件变动自动进行服务重载


相关示例请查看

热重载DEMO

热重载实现原理


转载请注明: ITTXX.CN--分享互联网 » EasySwoole ——基于Swoole分布式PHP框架快速入门

最后更新:2018-12-17 14:56:15

赞 (9) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽