EasySwoole 学习日志

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]# php easyswoole start d
______ _____ _
| ____| / ____| | |
| |__ __ _ ___ _ _ | (___ __ __ ___ ___ | | ___
| __| / _` | / __| | | | | \___ \ \ \ /\ / / / _ \ / _ \ | | / _ \
| |____ | (_| | \__ \ | |_| | ____) | \ 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-4ee5fb2568a1 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()
{
// TODO: Implement index() method.
$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 // 只重启task进程
php easyswoole reload all // 重启task+worker进程

// 停止服务
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]# php easyswoole help test
______ _____ _
| ____| / ____| | |
| |__ __ _ ___ _ _ | (___ __ __ ___ ___ | | ___
| __| / _` | / __| | | | | \___ \ \ \ /\ / / / _ \ / _ \ | | / _ \
| |____ | (_| | \__ \ | |_| | ____) | \ 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()
{
// TODO: Implement initialize() method.
date_default_timezone_set('Asia/Shanghai');
\App\Event\Event::getInstance()->set('test', function () {
echo 'test event';
});
}
  • 在其他任意位置调用:
1
Event::getInstance()->hook('test');

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :