簡介
有了swoole這樣強大的擴展之后,越來越多的框架都是基於swoole被開發出來,Swoft就是其中一款不錯的PHP框架。Swoft 是一款基於 Swoole 原生協程的注解式框架,自帶常駐內存以及 Swoole 其它功能的封裝。swoft中內置了協程客戶端。同時swoft里面有了很多新的概念,比如Aop等。
Swoft是基於Swoole開發的,如果不了解Swoole的可以看看我之前寫的文章Swoole高性能框架。
使用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過程中根據@Bean注解去獲取類的實例,然后再將實例裝載到Bean容器中,在需要的時候在根據命令去調用這些實例對象。下圖就是這個過程示意圖。
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