Swoole 4.4 正式版已發佈

向下不兼容改動

  • PHP官方保持一致, 再也不支持PHP7.0 (@matyhtf)
  • 移除Serialize模塊, 在單獨的 ext-serialize 擴展中維護. 廢棄緣由: 因爲PHP內核頻繁變動, 致使沒法實現穩定可用的模塊, 與php serialize相比沒有太大差別化定位
  • 移除PostgreSQL模塊,在單獨的 ext-postgresql 擴展中維護. 廢棄緣由: PostgreSQL使用了異步回調方式實現協程調度, 不符合目前內核協程化的統一規劃。另外PostgreSQL目前用戶量很是低, 而且缺乏必要的單元測試, 沒法保證質量
  • Runtime::enableCoroutine再也不會自動兼容協程內外環境, 一旦開啓, 則一切阻塞操做必須在協程內調用 (@matyhtf)
  • 因爲引入了全新的協程MySQL客戶端驅動, 底層設計更加規範, 但有一些小的向下不兼容的變化php

    • fetch/nextResult優化爲按需讀取, 會產生IO調度
    • 啓動defer特性時, statement發出的的請求, 須要使用statement->recv接收
    • 啓動defer/fetch_mode特性時, 若有未接收完的數據, 將沒法發起新的請求
    • 與異步不一樣, connected屬性再也不會實時基於事件更新, 而是在IO操做失敗後更新

廢棄警告

  • 將廢棄Buffer模塊,廢棄緣由:可替代性強,使用率低,可用PHP字符串、fopen("memory")代替。
  • 將廢棄Lock模塊,廢棄緣由:在協程模式下加鎖可能存在問題,可以使用chan實現協程版本的鎖
  • 因爲引入了stream_socket_pair協程化, 建議開啓hook時, 若有單獨配置需求, 請使用SWOOLE_HOOK_STREAM_FUNCTION常量而不是SWOOLE_HOOK_STREAM_SELECT

新特性

  • 新增Library, 使用純PHP編寫內核功能而非C/C++, 提供瞭如下功能html

    • 新增高質量PHP模塊Coroutine\WaitGroup (@twose)
    • 使用PHP代碼實現CURL的hook, 一鍵使CURL協程化, 目前爲實驗特性, 需特別調用Runtime::enableCoroutine(SWOOLE_HOOK_CURL)來開啓 (@matyhtf) (@Yurunsoft)
    • 使用PHP代碼實現exec/shell_exec的協程化 (#2657) (@Yurunsoft)
    • 開啓RuntimeHook時, 將替換函數array_walk, array_walk_recursive爲swoole實現的版本, 解決原生函數不可重入的問題, 但會形成沒法遍歷object (@matyhtf) (@twose)
  • 新增協程搶佔式調度器, 可防止協程佔用CPU時間過長致使其它協程餓死, 經過php.ini配置swoole.enable_preemptive_scheduler = On 開啓, 相關例子詳見preemptive_scheduler (@shiguangqi)
  • 新增Timer::list()返回Timer\Iterator, 可遍歷全部定時器, Timer\clearAll清除全部定時器, Timer\info(int $id)獲取定時器信息, Timer::stats()獲取全局定時器狀態 (#2498) (@twose)
  • 新增 Co\Socket的兩個方法getOptionsetOption (9d13c29) (@matyhtf)
  • 新增 Process\Pool$master_pid 屬性和 shutdown方法 (a1d6eaa) (@matyhtf)
  • 新增Process\Pool的構造方法的第四個參數, 爲true時底層將自動在onWorkerStart回調開啓協程 (8ceb32cd) (@matyhtf)
  • 新增stream_socket_pair協程化支持 (#2546) (@matyhtf)
  • 新增Http\Serverstatic_handler_locations設置, 能夠設定靜態文件路徑 (@matyhtf)
  • 新增Co\Http\Client->setBasciAuth方法, 用於自動發送Authorization頭 (#2542) (@hongbshi)
  • 新增 Co\Http2\Client->ping方法 (40041f6) (@shiguangqi)
  • 新增hook_flags配置項,用於取代Runtime::enableCoroutine()函數調用

加強

  • 全新的協程MySQL客戶端驅動, 底層全面協程化 (#2538) (@twose)mysql

    • 底層使用C++和協程的編程模式(同步阻塞寫法, 異步性能)
    • 支持SSL鏈接 (connect時配置 ['ssl' => true]便可, 暫不支持證書等配置)
    • 支持超大數據發送 (無上限, 底層自動拼包, 上限爲MySQL服務器配置上限)
    • 支持超大數據接收
    • 支持fetch按行讀取 (如今的fetch爲按需讀取, 未fetch的數據不會耗費用戶內存) (#2106)
    • 支持nextResult按需讀取 (同上)
    • 客戶端close後, 客戶端持有的statements自動轉爲不可用狀態, 避免邊界問題
    • 優化掉了一些沒必要要的內存拷貝(協議解析時)
    • date相關類型小數精度支持
    • 錯誤代碼和信息與PDO/mysqli保持一致
  • Co\Redis兼容模式, 經過$redis->set(['compatibility_mode' => true])開啓, 可以使得hmGet/hGetAll/zRange/zRevRange/zRangeByScore/zRevRangeByScore等方法返回結果和phpredis保持一致 (#2529) (@caohao-php)
  • 默認容許有100K個協程同時存在 (c69d320b) (@twose)
  • 支持bailout機制 (協程內發生致命錯誤時能正確退出進程) (#2579) (@twose)
  • Server發生錯誤時會根據狀況展現友好的400/404/503界面而不是沒有任何輸出 (@matyhtf) (f3f2be9d)
  • Server默認開啓異步安全重啓特性和超大數據發送的自動協程調度功能 (#2555) (9d4a4c47) (@matyhtf)
  • ServeronFinish回調支持自動協程環境 (@twose)
  • Http客戶端默認開啓websocket_mask, 再也不會出現莫名其妙連不上websocket的問題 (c02f4f85) (@twose)
  • 再也不容許在協程外使用Channel的調度操做 (519b6043) (@twose)
  • WebSocket握手失敗時切斷鏈接 (#2510) (@twose)
  • Linux下父進程異常退出時底層會自動發送信號殺死子進程 (4b833a3d) (@matyhtf)
  • Socket->recv的數據長度不足時回收末尾無用的內存 (642a3552) (@twose)
  • 浮點數計算偏差優化 (#2572) (@tangl163)
  • 全部內置類都 禁止克隆/禁止序列化/禁止刪除底層定義的屬性 (f9c974b8) (@twose)
  • Server->binduid超過UINT32_MAX時會產生警告並返回
  • 兼容PHP7.4 (#2506) (@twose)

修復

  • 修復Process\PoolgetProcess問題 (#2522) (@matyhtf)
  • 修復某些特殊狀況下異常被忽略的問題(VM陷入了事件循環而沒有機會檢查異常) (@twose)
  • 修復定時器在進程fork後產生的內存泄漏 (8f3abee7) (@twose)
  • 修復非Linux系統編譯時timezone的問題 (#2584) (@devnexen)
  • 修復enable_coroutinetask_enable_coroutine一開一關的問題 (#2585) (@matyhtf)
  • 修復Http2的trailer方法不輸出值爲空的頭 (#2578) (@twose)
  • 修復Co\Http\Client->setCookies在特殊狀況下的內存錯誤 (#2644) (@Yurunsoft)
  • 修復#2639 (#2656) (@mabu233)
  • 修復arginfo_swoole_process_pool_getProcess (#2658) (@mabu233)
  • 修復static_handler不支持軟連接 (@matyhtf)
  • 修復OSX下卡死 (22504dd4) (@matyhtf)
  • 修復啓用SSLtask進程使用Server->getClientInfo出錯 (#2639) (@matyhtf)
  • 修復多協程操做同一個Socket的非法操做BUG (#2661) (@twose)

協程調度器?

  • 新增Swoole\Coroutine\Scheduler調度器類做爲cli命令行腳本的入口,取代go() + Swoole\Event::wait()的方式
  • 增長Swoole\Coroutine\Run函數,提供對Swoole\Coroutine\Scheduler的封裝
  • go() + Swoole\Event::wait()的運行方式可能被廢除

內核

  • 持續的底層代碼質量優化工做 (@swoole)
  • 更多的單元測試, 並使用了基於 webmozart/assert 二次開發而來的斷言庫 swoole/assert (@twose)
  • 補全內存申請失敗檢測 (b19bebac) (5a1ddad3) (@matyhtf)
  • 完全廢除Windows支持計劃
  • 將協程的一些功能整理劃分到SystemScheduler模塊, 廢除util模塊
  • Co\Http2\Client底層協程化 (f64874c3) (@matyhtf)
  • 底層全面緩存了開發者註冊的函數信息, 調用回調時速度更快 (@twose)

實驗性內容

  • 可能在5.0新增的Co\ServerCo\Http\Server
  • CURL Hook(暫時不支持curl_multi
相關文章
相關標籤/搜索