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.不要再控制器寫基類來寫公共的變量,這樣會造成數據污染,當下一個請求進來依然會請求到這個變量,因為常駐內存並且單利所以不會釋放掉。
官方文件也有提示

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 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来获取一个类的信息,从而了解类里的信息,比如获取类中的所有方法、成员变量,并包括私有方法等,并根据这些信息实现一些操作。像很多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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在PHP應用程式中,我們有時需要使用目前日期作為檔案名稱來儲存或上傳檔案。雖然可以手動輸入日期,但使用當前日期作為檔案名稱可以更方便、快速和準確。在PHP中,我們可以使用date()函數來取得目前日期。此函數的使用方法為:date(format,timestamp);其中,format為日期格式字串,timestamp為表示日期和時間的時間戳,不傳遞此參數將使用

教學課程:使用FirebaseCloudMessaging在PHP應用程式中實現定時訊息推播功能概述FirebaseCloudMessaging(FCM)是Google提供的一種免費的訊息推播服務,它能夠幫助開發者向Android、iOS和Web應用程式發送即時訊息。本教學將帶領大家透過PHP應用程式使用FCM實現定時訊息推播功能。步驟一:建立Firebase專案首先,在F

一、什麼是泛型程式設計泛型程式設計是指在程式語言中實現一種通用的資料類型,使得這種資料類型能夠適用於不同的資料類型,從而實現程式碼的複用和高效。 PHP是一種動態型別語言,不像C++、Java等語言有強型別機制,因此在PHP中實作泛型程式設計不是一件容易的事。二、PHP中的泛型程式設計方式PHP中有兩種方式實作泛型程式設計:分別是使用介面和使用Trait。使用介面在PHP中建立一

Redis是一個高效能的key-value儲存系統,它支援多種資料結構,其中包括字串、雜湊表、列表、集合、有序集合等。同時,Redis也支援對字串資料進行正規表示式的匹配和替換操作,這使得它在開發PHP應用中具有很大的靈活性和便利性。在PHP應用中使用Redis進行正規表示式操作,需要先安裝好phpredis擴展,該擴展提供了與Redis伺服器進行通訊的

教學:使用百度雲推送(BaiduPush)擴展在PHP應用中實現訊息推送功能引言:隨著行動應用的快速發展,訊息推送功能在應用程式中變得越來越重要。為了實現即時通知和訊息推播功能,百度提供了強大的雲端推播服務,即百度雲端推播(BaiduPush)。在本教程中,我們將學習如何使用百度雲推送擴充(PHPSDK)在PHP應用中實現訊息推播功能。我們將使用百度雲

PHP中的簽名鑑權方法及其應用隨著網路的發展,Web應用程式的安全性愈發重要。簽名鑑權是一種常見的安全機制,用於驗證請求的合法性和防止未經授權的存取。本文將介紹PHP中的簽章鑑權方法及其應用,並提供程式碼範例。一、什麼是簽名鑑權?簽章鑑權是一種基於金鑰和演算法的驗證機制,透過對請求參數進行加密產生唯一的簽章值,服務端再透過同樣的演算法和金鑰對請求進行解密並驗證簽

Redis在PHP應用程式中的操作日誌在PHP應用中,使用Redis作為快取或儲存資料的方案已經變得越來越普遍了。 Redis是高效能的鍵值儲存資料庫,具有快速、可擴充、高可用、資料結構多樣等特性。在使用Redis時,為了更了解應用程式的運作情況,同時為了資料的安全性,我們需要有一份Redis操作日誌。 Redis操作日誌能夠記錄Redis伺服器上所有客戶端

PHP作為一種最受歡迎的伺服器端腳本語言之一,被廣泛應用於企業級網站的開發中。它的靈活性、可擴展性和易用性使得PHP成為企業級網站開發的首選語言。本文將討論PHP在企業級網站開發的應用。首先,PHP在企業級網站的開發中扮演關鍵的角色。它可以用於建立各種各樣的功能,包括用戶認證、數據儲存、數據分析和報告生成等。 PHP可以與資料庫進行無縫的集成,支援主流的數據
