天天看點

swoole| swoole wiki 筆記初心swoole 功能一覽swoole 協程swoole 協程 serverswoole 協程 clientswoole 程序 & 程序池其他程式設計指引phpNP(network programming)基礎devops

初心

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:

    Server->addProcess()

    process process-pool

輔助

  • memory: lock buffer table atomic mma
  • timer: tick after; server 中的 Timer 也會自動建立協程
  • event
  • 同步 client: client

曆史版本, 隻做了解, 不要造成心智負擔(可以不看)

swoole 協程

swoole 協程 server

swoole| swoole wiki 筆記初心swoole 功能一覽swoole 協程swoole 協程 serverswoole 協程 clientswoole 程式 & 程式池其他程式設計指引phpNP(network programming)基礎devops
swoole| swoole wiki 筆記初心swoole 功能一覽swoole 協程swoole 協程 serverswoole 協程 clientswoole 程式 & 程式池其他程式設計指引phpNP(network programming)基礎devops
swoole| swoole wiki 筆記初心swoole 功能一覽swoole 協程swoole 協程 serverswoole 協程 clientswoole 程式 & 程式池其他程式設計指引phpNP(network programming)基礎devops

swoole 協程 client

swoole 程序 & 程序池

其他

  • 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()

  • memory_get_usage() + memory_limit

    來做記憶體檢測 -> 防止 worker 記憶體溢出, 配合

    exit()

    退出worker程序, manager 程序會自動拉起新的 worker 程序

NP(network programming)基礎

swoole| swoole wiki 筆記初心swoole 功能一覽swoole 協程swoole 協程 serverswoole 協程 clientswoole 程式 & 程式池其他程式設計指引phpNP(network programming)基礎devops

): 為什麼需要協定->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

  • 監控/日志/性能/工具
  • 案例