首頁  >  文章  >  後端開發  >  PHP之微服務協程框架Swoft

PHP之微服務協程框架Swoft

coldplay.xixi
coldplay.xixi轉載
2020-06-17 17:17:475077瀏覽

PHP之微服務協程框架Swoft

簡介

  有了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目錄

PHP之微服務協程框架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
PHP之微服務協程框架Swoft

SwoftBean容器

   Bean容器是Swoft的核心,每個Bean就是一個類別物件的實例,容器就是一個工廠來存放和管理Bean。在HttpServer啟動時候會掃描帶有@Bean註解的類別。傳統的PHP是沒有常駐內存的,每次請求都會重新初始化各種資源,每個物件也要重新實例化去申請內存,處理完請求後又被消耗,十分浪費資源。而Swoft在HttpServer啟動後會將這些物件實例化並存放在記憶體中,下次請求就直接取出使用,減少物件創建資源的消耗。

    Bean容器底層是一個BeanFactory管理容器(Container)。

Swoft註解(Annotations)機制

註解是Swoft裡面很多重要功能特別是AOP,IoC容器的基礎。熟悉Java的朋友應該更了解註解。 

那麼註解是什麼樣子呢?以下是Swoft的一部分程式碼在類別、方法或成員變數上方的註解部分就有註解。

PHP之微服務協程框架Swoft
namespace App\Tcp\Controller;

use App\Tcp\Middleware\DemoMiddleware;
use Swoft\Tcp\Server\Annotation\Mapping\TcpController;
use Swoft\Tcp\Server\Annotation\Mapping\TcpMapping;
use Swoft\Tcp\Server\Request;
use Swoft\Tcp\Server\Response;
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之微服務協程框架Swoft

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

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

以上是PHP之微服務協程框架Swoft的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:php100.com。如有侵權,請聯絡admin@php.cn刪除