视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PHP之微服务协程框架Swoft
2020-11-02 22:07:03 责编:小采
文档


简介

  有了swoole这样强大的扩展之后,越来越多的框架都是基于swoole被开发出来,Swoft就是其中一款不错的PHP框架。Swoft 是一款基于 Swoole 原生协程的注解式框架,自带常驻内存以及 Swoole 其它功能的封装。swoft中内置了协程客户端。同时swoft里面有了很多新的概念,比如Aop等。

  官网地址:https://www.swoft.org/

使用Swoft框架注意事项

  因为Swoft是基于Swoole,所以和普通的PHP框架还是很不一样的,有些是需要注意的。

  1.不要再代码中执行sleep()以及其他睡眠函数,这样会导致整个进程阻塞。

  2.不要使用exit/die函数,这样会导致worker进程直接退出。

  3.进程隔离需要注意的,当修改了全局变量的值,会不生效,因为全局变量在不同的进程中,内存空间是隔离的。使用Swoft框架需要了解进程隔离问题。不同的进程中PHP变量不是共享,即便是全局变量。如果不同的进程需要共享数据,可以使用Redis,Mysql,消息队列,文件,Swoole/Table,APCu(php自带的缓存扩展),shmget(进程通信(IPC)共享内存)等工具。同时不同进程的文件句柄也是隔离的,所以在A进程创建的Socker连接打开的文件在B进程内是无效的。

  4.进程克隆,当server启动时候,主进程会克隆当前进程状态,此后开始进程内的数据互相,互不影响。

  5.不要再控制器写基类来写公共的变量,这样会造成数据污染,当下一个请求进来依然会请求到这个变量,因为常驻内存并且单利所以不会释放掉。

  官方文档也有提示

https://www.swoft.org/documents/v2/dev-guide/dev-note/

Swoft框架安装

  安装环境要求:

    1. gcc版本大于等于4.8。

    2. PHP版本大于7.1。

    3. Composer包管理工具。

    4. 安装Redis异步客户端hiredis,在最新版本的Swoole4.2.6之后已经内置了,不需要安装。

    5. Swoole扩展,这个是必须的。

    6.链接迭代器依赖库pcre。

    7. Swoole需要开启协程和异步redis。

  安装

git clone https://github.com/swoft-cloud/swoft
cd swoft
composer install
cp .env.example .env #编辑 .env 文件,根据需要调整相关环境配置

如果出现下面错误说明redis扩展没有,因为swoft需要redis扩展。

当然使用docker方式会更加简单,执行下面命令

docker run -p 18306:18306 --name swoft swoft/swoft

在浏览器中输入 http://127.0.0.1:18306 就可以打开Swoft本地页面。

关闭和开启运行命令 docker start/stop swoft

Swoft目录及文件说明

进入容器查看swoft目录

root@880c142615c3:/var/www/swoft# tree -L 2
.
|-- CONTRIBUTING.md
|-- Dockerfile
|-- LICENSE
|-- README.md
|-- README.zh-CN.md
|-- app #应用目录
| |-- Annotation        #定义注解相关目录| |-- Application.php
| |-- Aspect
| |-- AutoLoader.php
| |-- Common
| |-- Console
| |-- Exception
| |-- Helper          #助手函数目录
| |-- Http
| |-- Listener         #事件目录| |-- Migration
| |-- Model           #模型、逻辑等代码目录| |-- Process
| |-- Rpc            #RPC服务代码目录| |-- Task            #任务投递管理目录,这里可以做异步任务或者定时器的工作
| |-- Tcp
| |-- Validator
| |-- WebSocket         #WebSocket服务代码目录| `-- bean.php
|-- bin
| |-- bootstrap.php
| `-- swoft           #Swoft入口文件|-- composer.cn.json
|-- composer.json
|-- composer.lock
|-- config
| |-- base.php
| |-- db.php
| `-- dev
|-- database
| |-- AutoLoader.php
| `-- Migration
|-- dev.composer.json
|-- docker-compose.yml
|-- phpstan.neon.dist
|-- phpunit.xml
|-- public
| |-- favicon.ico
| `-- image
|-- resource #应用资源目录| |-- language
| `-- views
|-- runtime           #临时文件目录(日志、上传文件、文件缓存等)| |-- logs
| |-- sessions
| |-- swoft.command
| `-- swoft.pid
|-- test              #单元测试目录   
| |-- apitest
| |-- bootstrap.php
| |-- run.php
| |-- testing
| `-- unit
`-- vendor
 |-- autoload.php
 |-- bin
 |-- composer
 |-- doctrine
 |-- monolog
 |-- myclabs
 |-- nikic
 |-- phar-io
 |-- php-di
 |-- phpdocumentor
 |-- phpoption
 |-- phpspec
 |-- phpunit
 |-- psr
 |-- sebastian
 |-- swoft
 |-- symfony
 |-- text
 |-- theseer
 |-- toolkit
 |-- vlucas
 `-- webmozart

SwoftBean容器

   Bean容器是Swoft的核心,每一个Bean就是一个类对象的实例,容器就是一个工厂来存放和管理Bean。在HttpServer启动时候会扫描带有@Bean注解的类。传统的PHP是没有常驻内存的,每次请求都会重新初始化各种资源,每个对象也要重新实例化去申请内存,处理完请求后又被消耗,十分浪费资源。而Swoft在HttpServer启动后会将这些对象实例化并存放在内存中,下次请求就直接取出使用,减少对象创建资源的消耗。

   Bean容器底层是一个BeanFactory管理容器(Container)。

Swoft注解(Annotations)机制

注解是Swoft里面很多重要功能特别是AOP,IoC容器的基础。熟悉Java的朋友应该更加了解注解。 

那么注解是什么样呢?下面是Swoft的一部分代码,在类、方法或成员变量上方的注释部分就有注解。

namespace AppTcpController;

use AppTcpMiddlewareDemoMiddleware;
use SwoftTcpServerAnnotationMappingTcpController;
use SwoftTcpServerAnnotationMappingTcpMapping;
use SwoftTcpServerRequest;
use SwoftTcpServerResponse;
use function strrev;

/**
 * Class DemoController
 *
 * @TcpController(middlewares={DemoMiddleware::class}) #这个就是注解
 */
class DemoController
{
 /**
 * @TcpMapping("list", root=true)
 * @param Response $response
 */
 public function list(Response $response): void
 {
 $response->setData('[list]allow command: list, echo, demo.echo');
 }

  注解是什么呢?有什么作用呢?

    注解其实是通过反射把注释当成代码的一部分,PHP可以通过ReflectionClass来获取一个类的信息,从而了解类里的信息,比如获取类中的所有方法、成员变量,并包括私有方法等,并根据这些信息实现一些操作。像很多PHP框架,比如laravel框架就利用PHP的反射机制来实现依赖注入。

    其实注解是配置的另一种方式,这里注解就可以起到一个配置作用。比如定义路由,定义配置定时任务,权限控制等。

    在Swoft中要是使用注解,需引入相关注解(Annotation)类,且必须以 /** 开始并以 */ 结束,否则会导致无法解析!

Aop切面编程

  Aop介绍

    1. Aspect(切面):通常是一个类,里面可以定义切入点和通知。

    2. JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用。

    3. Advice(通知):Aop在特定的切入点执行的增强处理,有before,after,afterReturning,afterThrowing,around。

    4. Pointcut(切入点):就是嗲有通知的连接点,在程序中主要体现为书写切入点表达式。

   Swoft新版的Aop设计建立在PHP Parser上面。

    PHP-Parser的项目主页是:https://github.com/nikic/PHP-Parser

推荐教程:《php教程》

下载本文
显示全文
专题