当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP之微服务协程框架Swoft

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-01 08:00:24 浏览: 评论:0 

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

官方文档也有提示

PHP之微服务协程框架Swoft

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扩展。

PHP之微服务协程框架Swoft

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

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

PHP之微服务协程框架Swoft

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

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

Swoft目录及文件说明

进入容器查看swoft目录

  1. root@880c142615c3:/var/www/swoft# tree -L 2 
  2. |-- CONTRIBUTING.md 
  3. |-- Dockerfile 
  4. |-- LICENSE 
  5. |-- README.md 
  6. |-- README.zh-CN.md 
  7. |-- app                        #应用目录 
  8. |   |-- Annotation        #定义注解相关目录|   |-- Application.php 
  9. |   |-- Aspect 
  10. |   |-- AutoLoader.php 
  11. |   |-- Common 
  12. |   |-- Console 
  13. |   |-- Exception 
  14. |   |-- Helper          #助手函数目录 
  15. |   |-- Http 
  16. |   |-- Listener         #事件监听器目录|   |-- Migration 
  17. |   |-- Model           #模型、逻辑等代码目录|   |-- Process 
  18. |   |-- Rpc            #RPC服务代码目录|   |-- Task            #任务投递管理目录,这里可以做异步任务或者定时器的工作 
  19. |   |-- Tcp 
  20. |   |-- Validator 
  21. |   |-- WebSocket         #WebSocket服务代码目录|   `-- bean.php 
  22. |-- bin 
  23. |   |-- bootstrap.php 
  24. |   `-- swoft            #Swoft入口文件|-- composer.cn.json 
  25. |-- composer.json 
  26. |-- composer.lock 
  27. |-- config 
  28. |   |-- base.php 
  29. |   |-- db.php 
  30. |   `-- dev 
  31. |-- database 
  32. |   |-- AutoLoader.php 
  33. |   `-- Migration 
  34. |-- dev.composer.json 
  35. |-- docker-compose.yml 
  36. |-- phpstan.neon.dist 
  37. |-- phpunit.xml 
  38. |-- public 
  39. |   |-- favicon.ico 
  40. |   `-- image 
  41. |-- resource                   #应用资源目录|   |-- language 
  42. |   `-- views 
  43. |-- runtime             #临时文件目录(日志、上传文件、文件缓存等)|   |-- logs 
  44. |   |-- sessions 
  45. |   |-- swoft.command 
  46. |   `-- swoft.pid 
  47. |-- test              #单元测试目录    
  48. |   |-- apitest 
  49. |   |-- bootstrap.php 
  50. |   |-- run.php 
  51. |   |-- testing 
  52. |   `-- unit 
  53. `-- vendor 
  54.     |-- autoload.php 
  55.     |-- bin 
  56.     |-- composer 
  57.     |-- doctrine 
  58.     |-- monolog 
  59.     |-- myclabs 
  60.     |-- nikic 
  61.     |-- phar-io 
  62.     |-- php-di 
  63.     |-- phpdocumentor 
  64.     |-- phpoption 
  65.     |-- phpspec 
  66.     |-- phpunit 
  67.     |-- psr 
  68.     |-- sebastian 
  69.     |-- swoft 
  70.     |-- symfony 
  71.     |-- text 
  72.     |-- theseer 
  73.     |-- toolkit 
  74.     |-- vlucas 
  75.     `-- webmozart 

SwoftBean容器

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

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

Swoft注解(Annotations)机制

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

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

  1. namespace App\Tcp\Controller; 
  2.  
  3. use App\Tcp\Middleware\DemoMiddleware; 
  4. use Swoft\Tcp\Server\Annotation\Mapping\TcpController; 
  5. use Swoft\Tcp\Server\Annotation\Mapping\TcpMapping; 
  6. use Swoft\Tcp\Server\Request; 
  7. use Swoft\Tcp\Server\Response; 
  8. use function strrev
  9.  
  10. /** 
  11.  * Class DemoController 
  12.  * 
  13.  * @TcpController(middlewares={DemoMiddleware::class})      #这个就是注解 
  14.  */ 
  15. class DemoController 
  16.     /** 
  17.      * @TcpMapping("list", root=true) 
  18.      * @param Response $response 
  19.      */ 
  20.     public function list(Response $response): void 
  21.     { 
  22.         $response->setData('[list]allow command: list, echo, demo.echo'); 
  23.     } 

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

注解其实是通过反射把注释当成代码的一部分,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

Tags: Swoft

分享到: