PHP中的Swoft框架

簡介

成都創(chuàng)新互聯(lián)自2013年起,先為長海等服務建站,長海等地企業(yè),進行企業(yè)商務咨詢服務。為長海企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

有了swoole這樣強大的擴展之后,越來越多的框架都是基于swoole被開發(fā)出來,Swoft就是其中一款不錯的PHP框架。Swoft 是一款基于 Swoole 原生協(xié)程的注解式框架,自帶常駐內存以及 Swoole 其它功能的封裝。swoft中內置了協(xié)程客戶端。同時swoft里面有了很多新的概念,比如Aop等。

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

使用Swoft框架注意事項

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

1.不要再代碼中執(zhí)行sleep()以及其他睡眠函數,這樣會導致整個進程阻塞。

2.不要使用exit/die函數,這樣會導致worker進程直接退出。

3.進程隔離需要注意的,當修改了全局變量的值,會不生效,因為全局變量在不同的進程中,內存空間是隔離的。使用Swoft框架需要了解進程隔離問題。不同的進程中PHP變量不是共享,即便是全局變量。如果不同的進程需要共享數據,可以使用redis,MySQL,消息隊列,文件,Swoole/Table,APCu(php自帶的緩存擴展),shmget(進程通信(IPC)共享內存)等工具。同時不同進程的文件句柄也是隔離的,所以在A進程創(chuàng)建的Socker連接打開的文件在B進程內是無效的。

4.進程克隆,當server啟動時候,主進程會克隆當前進程狀態(tài),此后開始進程內的數據互相獨立,互不影響。

5.不要再控制器寫基類來寫公共的變量,這樣會造成數據污染,當下一個請求進來依然會請求到這個變量,因為常駐內存并且單利所以不會釋放掉。

官方文檔也有提示

Swoft框架安裝

安裝環(huán)境要求:

1. gcc版本大于等于4.8。

2. PHP版本大于7.1。

3. Composer包管理工具。

4. 安裝Redis異步客戶端hiredis,在最新版本的Swoole4.2.6之后已經內置了,不需要安裝。

5. Swoole擴展,這個是必須的。

6.鏈接迭代器依賴庫pcre。

7. Swoole需要開啟協(xié)程和異步redis。

安裝

git clone https://github.com/swoft-cloud/swoft
cd swoft
composer install
cp .env.example .env   #編輯 .env 文件,根據需要調整相關環(huán)境配置

如果出現(xiàn)下面錯誤說明redis擴展沒有,因為swoft需要redis擴展。

當然使用docker方式會更加簡單,執(zhí)行下面命令

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         #事件監(jiān)聽器目錄|   |-- 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注解的類。傳統(tǒng)的PHP是沒有常駐內存的,每次請求都會重新初始化各種資源,每個對象也要重新實例化去申請內存,處理完請求后又被消耗,十分浪費資源。而Swoft在HttpServer啟動后會將這些對象實例化并存放在內存中,下次請求就直接取出使用,減少對象創(chuàng)建資源的消耗。

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

Swoft注解(Annotations)機制

注解是Swoft里面很多重要功能特別是AOP,IoC容器的基礎。熟悉Java的朋友應該更加了解注解?!?/p>

那么注解是什么樣呢?下面是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可以通過ReflectionClass來獲取一個類的信息,從而了解類里的信息,比如獲取類中的所有方法、成員變量,并包括私有方法等,并根據這些信息實現(xiàn)一些操作。像很多PHP框架,比如laravel框架就利用PHP的反射機制來實現(xiàn)依賴注入。

其實注解是配置的另一種方式,這里注解就可以起到一個配置作用。比如定義路由,定義配置定時任務,權限控制等。

在Swoft中要是使用注解,需引入相關注解(Annotation)類,且必須以 /** 開始并以 */ 結束,否則會導致無法解析!

Aop切面編程

Aop介紹

1. Aspect(切面):通常是一個類,里面可以定義切入點和通知。

2. JointPoint(連接點):程序執(zhí)行過程中明確的點,一般是方法的調用。

3. Advice(通知):Aop在特定的切入點執(zhí)行的增強處理,有before,after,afterReturning,afterThrowing,around。

4. Pointcut(切入點):就是嗲有通知的連接點,在程序中主要體現(xiàn)為書寫切入點表達式。

     Swoft新版的Aop設計建立在PHP Parser上面。

PHP-Parser的項目主頁是:https://github.com/nikic/PHP-Parser

以上就是PHP之微服務協(xié)程框架Swoft的詳細內容,更多請關注創(chuàng)新互聯(lián)其它相關文章!

本文題目:PHP中的Swoft框架
轉載注明:http://muchs.cn/article26/iehhcg.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計、品牌網站建設、建站公司、App設計網站制作、域名注冊

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網站