初心
PHP想做微服務, 離不開 swoole. 而 swoole 進入協程時代後, 是時候抛開曆史的包袱, 輕裝上陣了. 希望這樣過一份 swoole 知識的梳理, 能對 PHPer 有所幫助.
梳理 swoole wiki 的方向建議: 盡量用協程, 實在不行就同步, 所有的知識都圍繞這展開.
swoole 功能一覽
重點
- 協程 server(繼承關系): server(tcp/udp) http(http/http2) websocket
- 協程 client: client http http2 socket pgsql zookeeper
- 協程 runtime
- process:
process process-poolServer->addProcess()
輔助
- memory: lock buffer table atomic mma
- timer: tick after; server 中的 Timer 也會自動建立協程
- event
- 同步 client: client
曆史版本, 隻做了解, 不要造成心智負擔(可以不看)
- ext: ext-async( 非協程特性擴充 )
- 異步 client: client mysql redis http
swoole 協程
- swoole| swoole 協程初體驗 : 輔助了解協程的基本概念
- swoole| swoole 協程知識點小結 : 輔助了解 swoole 中的協程知識點
- swoole| swoole 協程用法筆記 : swoole 協程 API 梳理/速查
swoole 協程 server
- setting
- 常用配置
- 配置選項
- dispatch_mode: 1-輪詢(平均)配置設定 2-按fd取模(預設) 3-争搶配置設定 7-stream
- task
- task_worker_num
- task_ipc_mode
- task_enable_coroutine : task支援同步/協程, API有差異
- ssl
- 'ssl_cert_file' => $key_dir.'/ssl.crt',
- 'ssl_key_file' => $key_dir.'/ssl.key',
- 固定標頭協定自動分包
- open_length_check => true
- package_length_type => 'N' // pack()
- package_length_offset => 10
- package_body_offset => 120
- package_max_length => 800000
- 多端口監聽 : 一個swoole, 多個server
- server中對象的4層生命周期 : 注意和傳統 fpm 的差別
swoole 協程 client
- 是否可以共用同一個redis/mysql連接配接 : 連接配接池是标配
swoole 程序 & 程序池
- Swoole| Swoole 中 Process : 主要内容是程序間通信部分
-
: 廣播消息->addProcess()
- 使用
- process-pool: 需要長期運作的腳本, 比如 mq 消費者
- process+協程
其他
- swoole相關函數
- 附錄: linux信号 linux錯誤碼 swoole錯誤碼 tcp連接配接狀态 tcpdump/strace/gdb/lsof/perf
程式設計指引
- swoole 快速起步 daydaygo/php-note : swoole API 簡單 demo, 友善速查
- 學習 swoole 需要掌握的基礎知識 : linux高性能伺服器程式設計; UNP; tcp/ip詳解
- swoole 程式設計注意事項 : 語言相關/協程程式設計/并發程式設計/記憶體管理/程序隔離
- 版本更新記錄 : 仔細看看, 就能體會到開發組的努力
- 版本路線路線圖: trello [rfc-chinese]() rfc
- 程式設計建議(個人看法)
- 基礎知識的補充和紮實, 遠比對 API 的熟悉要強, 建議花時間了解: 網絡程式設計基礎; 同步/異步/協程基本概念; swoole程序/線程模型; swoole各元件+元件功能+元件生命周期
- 程式設計方式: 盡量使用協程, 實在不行就同步; 好處很明顯, 關注swoole功能的子集, 了解和熟悉API 都容易不少
- 建議不使用别名, 直接使用原寫法, 如
是Server->tick()
的别名\Swoole\Timer::tick()
- 建議除了
等十分常用的函數, 不要使用簡寫, 直接使用原寫法, 如go() chan()
Co::sleep()
的簡寫\Swoole\Coroutine::sleep()
php
- callback
- 信号處理 ext-pcntl
- 原生socket
ext-socket
stream_socket_client()
-
來做記憶體檢測 -> 防止 worker 記憶體溢出, 配合memory_get_usage() + memory_limit
退出worker程序, manager 程序會自動拉起新的 worker 程序exit()
NP(network programming)基礎
): 為什麼需要協定->tcp是流式(stream), 需要協定設定邊界; 設計->換行符/固定標頭
- 多程序共享資料 : 為什麼->程序隔離; ext-apcu/yac(僅作緩存)/swoole memory系列元件
- 程序信号處理:
pcntl_signal() / pcntl_signal_dispatch()
- 并發程式設計: 并發執行->為每個用戶端/請求, 創造不同資源和上下文(context)
- 核心參數調整
檢視所有核心參數;sysctl -a
檔案夾/proc/sys/
devops
- 實踐推薦
- 項目git -> 綁定阿裡雲容器鏡像服務 -> 關聯容器服務(小型項目可以先用 swarm 驗證, 大型複雜項目轉k8s)
- git 更新 -> 觸發鏡像自動建構 -> 鏡像建構完後, 觸發容器自動部署
- 開發: 同一份鏡像, 開發環境統一
- 使用容器來管理服務生命周期, 替代傳統的服務管理方式( systemd ; 開機啟動
等服務管理函數->reload()
- swoole 安裝
- PHP版本( PHP版本支援 ): 推薦 >=7.2; 隻有同步 client 可以在 fpm 下使用
- 安裝執行個體: docker - swoft/alphp
- 編譯參數: 上面 Dockerfile 中的示例就夠了, 還可添加
--enable-coroutine-postgresql
- 監控/日志/性能/工具
-
Server->stats
- swoole日志 task日志
- ab 壓力測試 : 還是那句話, 你用 swoole 達不到的性能, 換個語言, 呵呵呵
- timer壓測 10w個 0.08s
- tcp/udp壓測工具
-
- 案例
- 多點傳播實作 : httpserver 登入服務 + proxy層轉發資訊 + WS聊天室
- tech| 再探grpc