把ThinkPHP的官方文檔擼了3遍以上,Webman擼了兩邊,再加上實際項目的開發和對比,才有的本文章,希望能幫到大家,如有錯誤和疏漏請不吝賜教~
1、webman內存常駐,業務執行只有3個流程(框架接收請求、框架執行業務邏輯、框架將結果返回給客戶端);TP業務流程從 nginx/apache接收請求 到 php-fpm初始化環境,如創建變量列表 到 框架初始化(載入 Composer 的自動加載 autoload 文件 開始),如實例化各種類,包括如容器、控制器、路由、中間鍵等 到 數據庫、Redis的連接、使用釋放 到 php-fpm釋放資源、銷毀所有類定義、實例、銷毀符號表等 到 php-fpm將結果轉發給nginx/apache 到 nginx/apache將結果返回給客戶端 等很多重復步驟。
2、webman沒有pathinfo,只能使用常規POST、GET等來傳遞參數,但可以用路由來定義參數來實現類似功能;TP有pathinfo,默認為 參數/值。。。,可配置格式(個人感覺過度封裝)。
3、webman默認不支持自動注入(需要安裝插件),每個方法的第一個參數貌似必須是Request對象,后面才是相關的路由變量傳遞的參數;TP默認支持自動注入(將參數中的對象自動注入容器中已有的對應類型)。
4、Request、Response、Controller、Route、Middleware、view、ExceptionHaddler、多應用 方面,大體功能是差不多的,Webman比較精簡,TP比較全面(有點凌亂不好記),有一些小區別:
多應用:TP單和多只能使用一種;而Webman默認兩種同時可用(注意單應用的路由有可能會和多應用目錄沖突),也有多應用模塊插件可以支持更多的功能。
中間件:Webman不支持控制器中間件,全局、應用、路由中間件都大同小異。
路由:
a、TP的路由是一條條解析,匹配即進入,路由可重復定義;Webman稍有不同,定義時如果有相同路由,則控制臺會報錯無法啟動服務(好處是及時能發現錯誤)。
b、TP默認支持多個路由文件(route目錄,自動執行),自動載入;而Webman默認單個路由文件(config目錄下的route.php)(稍微修改下可以做到類似的功能);
c、TP的多層次目錄,是用 . 來分隔;而1.4之后的版本的webman也支持多層次目錄,用 / 分隔。
d、路由規則的第一個參數:Webman是 / 開頭,而TP不是;
e、TP的路由規則的第二個參數:TP是\[控制器類, '方法'\],TP是 字符串(包含目錄、控制器名和方法)。
f、都不匹配的路由:TP是route::miss,Webman是route::fallback;
g、資源路由:第二個參數 和 指定方法 稍有不同;
h、TP的資源路由和Webman的資源路由名稱對應:
TP:\['index', 'read', 'save', 'update', 'delete'\]
Webman:\['index', 'show', 'store', 'update', 'destroy'\]
i、路由變量定義:
TP:用 或 :xx,可選為:\[:month\] 或
Webman:用{xx},可選為:\[{xx}\]
j、TP的 路由變量 也會出現在 Request 中讀取,而 Webman 沒有;
k、TP的路由變量的值,為字母、數字、.號、\_號組成,其他的都不會出現(后面的也會被截斷);
Webman的路由變量的值,除了 #號、?號、/號、\\號 外都支持。
l、路由變量的匹配:
TP:路由變量名 和 方法的參數名 必須一致,否則出錯,它會按 名稱 來給參數賦值;
Webman:路由變量名隨便定義,它會按 順序 給方法的參數一一賦值;
m、返回的路由地址區別:
TP:app('request')->rule()->getRule();
返回的路由地址 不是 /號 開頭,路由變量格式:;
Webman:$request->route->getPath();
返回的路由地址 以 /號 開頭,路由變量格式:{xx};
l、TP支持Delete的body,webman不支持,會交替循環的出現404錯誤。
5、插件、擴展、模塊:webman 的 plugin目錄 類似于 TP 的 extend目錄,不過webman的命名空間是以 plugin\\ 開頭的,而TP的可以和普通使用一樣。
6、容器:TP有app()助手函數(其實就是Container::getInstance()->make),可以實例化對象(參數3控制是否為新建);webman是用 Container來實例化對象(get為重用,make為新建)。
TP可以用 bind 綁定 標識 到 容器 中(不知有何用)。
8、webman的輸出是輸出到控制臺,而TP是輸出到頁面。
9、Webman的config便捷函數可以獲取配置(配置名為文件名),但只讀(有插件可增刪改);TP需要使用 think\\facade\\Config::get('文件名') 和 set($d, '文件名')來操作,TP的可讀可寫;
10、Webman可用TP的validate、orm(Db和Model)、Cache(Redis)、Captcha。
11、TP默認支持 .env 文件;Webman需要安裝插件,或自己寫一個;
注意:Webman配置文件中若使用某方法,必須寫在helper.php 而非 function.php 中,因為載入配置時function還沒載入。
12、門面:Webman不支持,因為雖然方便書寫,但沒有代碼提示功能;
13、事件:TP默認支持;Webman需要安裝插件;
TP:可以手動注冊事件到處理器;Webman只能在 config/event.php 處理;
14、服務:未知;
15、定時任務:crontab插件
16、其他:
TP的控制器每次訪問都會重新構造,并調用構造函數;Webman可以在 config/app.php 中開啟:'controller\_reuse' => false,不推薦 action-hook 插件(有BUG);
- Golang
- Beego框架
- Gin框架
- gin框架介紹
- 使用Gin web框架的知名開源線上項目
- go-admin-gin
- air 熱啟動
- 完整的form表單參數驗證語法
- Go 語言入門練手項目推薦
- Golang是基于多線程模型
- golang 一些概念
- Golang程序開發注意事項
- fatal error: all goroutines are asleep - deadlock
- defer
- Golang 的內建調試器
- go部署
- golang指針重要性
- 包(golang)
- Golang框架選型比較: goframe, beego, iris和gin
- GoFrame
- golang-admin-項目
- go module的使用方法及原理
- go-admin支持多框架的后臺系統(go-admin.cn)
- docker gocv
- go-fac
- MSYS2
- 企業開發框架系統推薦
- gorm
- go-zero
- 優秀系統
- GinSkeleton(gin web 及gin 知識)
- 一次 request -> response 的生命周期概述
- 路由與路由組以及gin源碼學習
- 中間件以及gin源碼學習
- golang項目部署
- 獨立部署golang
- 代理部署golang
- 容器部署golang
- golang交叉編譯
- goravel
- kardianos+gin 項目作為windows服務運行
- go env
- 適用在Windows、Linux和macOS環境下打包Go應用程序的詳細步驟和命令
- Redis
- Dochub
- Docker部署開發go環境
- Docker部署運行go環境
- dochub說明
- Vue
- i18n
- vue3
- vue3基本知識
- element-plus 表格單選
- vue3后臺模板
- Thinkphp
- Casbin權限控制中間件
- 容器、依賴注入、門面、事件、中間件
- tp6問答
- 偽靜態
- thinkphp-queue
- think-throttle
- thinkphp隊列queue的一些使用說明,queue:work和queue:listen的區別
- ThinkPHP6之模型事件的觸發條件
- thinkphp-swoole
- save、update、insert 的區別
- Socket
- workerman
- 介紹
- 從ThinkPHP6移植到Webman的一些技術和經驗(干貨)
- swoole
- swoole介紹
- hyperf
- hf官網
- Swoft
- swoft官網
- easyswoole
- easyswoole官網地址
- EASYSWOOLE 聊天室DEMO
- socket問答
- MySQL
- 聚簇索引與非聚簇索引
- Mysql使用max獲取最大值細節
- 主從復制
- 隨機生成20萬User表的數據
- MySQL進階-----前綴索引、單例與聯合索引
- PHP
- 面向切面編程AOP
- php是單線程的一定程度上也可以看成是“多線程”
- PHP 線程,進程、并發、并行 的理解
- excel數據畫表格圖片
- php第三方包
- monolog/monolog
- league/glide
- 博客-知識網站
- php 常用bc函數
- PHP知識點的應用場景
- AOP(面向切面編程)
- 注解
- 依賴注入
- 事件機制
- phpspreadsheet導出數據和圖片到excel
- Hyperf
- mineAdmin
- 微服務
- nacos注冊服務
- simps-mqtt連接客戶端simps
- Linux
- 切換php版本
- Vim
- Laravel
- RabbitMQ
- thinkphp+rabbitmq
- 博客
- Webman框架
- 框架注意問題
- 關于內存泄漏
- 移動端自動化
- 懶人精靈
- 工具應用
- render
- gitlab Sourcetree
- ssh-agent失敗 錯誤代碼-1
- 資源網站
- Git
- wkhtmltopdf
- MSYS2 介紹
- powershell curl 使用教程
- NSSM(windows服務工具)
- MinGW64
- 知識擴展
- 對象存儲系統
- minio
- 雪花ID
- 請求body參數類型
- GraphQL
- js 深拷貝
- window 共享 centos文件夾
- 前端get/post 請求 特殊符號 “+”傳參數問題
- 什么是SCM系統?SCM系統與ERP系統有什么區別?
- nginx 日志格式統一為 json
- 特殊符號怎么打
- 收藏網址
- 收藏-golang
- 收藏-vue3
- 收藏-php
- 收藏-node
- 收藏-前端
- 規劃ITEM
- 旅游類
- 人臉識別
- dlib
- Docker&&部署
- Docker-compose
- Docker的網絡模式
- rancher
- DHorse
- Elasticsearch
- es與kibana都docke連接
- 4種數據同步到Elasticsearch方案
- GPT
- 推薦系統
- fastposter海報生成
- elasticsearch+logstash+kibana
- beego文檔系統-MinDoc
- jeecg開源平臺
- Java
- 打包部署
- spring boot
- 依賴
- Maven 相關 命令
- Gradle 相關命令
- mybatis
- mybatis.plus
- spring boot 模板引擎
- SpringBoot+Maven多模塊項目(創建、依賴、打包可執行jar包部署測試)完整流程
- Spring Cloud
- Sentinel
- nacos
- Apollo
- java推薦項目
- gradle
- Maven
- Nexus倉庫管理器
- Python
- Masonite框架
- scrapy
- Python2的pip2
- Python3 安裝 pip3
- 安全攻防
- 運維技術
- 騰訊云安全加固建議
- 免費freessl證書申請
- ruby
- homeland
- Protobuf
- GIT
- FFMPEG
- 命令說明
- 音頻
- ffmpeg合并多個MP4視頻
- NODEJS
- 開發npm包
- MongoDB
- php-docker-mongodb環境搭建
- mongo基本命令
- Docker安裝MongoDB最新版并連接
- 少兒編程官網
- UI推薦
- MQTT
- PHP連接mqtt
- EMQX服務端
- php搭建mqtt服務端