歡迎您光臨本站 註冊首頁

Swoole 4.4 正式版已發布,包含大量更新

←手機掃碼閱讀     admin @ 2019-07-10 , reply:0

 Swoole 4.4 正式版已發布,該版本包含大量更新,詳細信息如下:

向下不兼容改動

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

    • 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++, 提供了以下功能

    • 新增高質量PHP模塊Coroutine\WaitGroup (@twose)
    • 使用PHP代碼實現CURL的hook, 一鍵使CURL協程化, 目前為實驗特性, 需特別調用Runtime::enableCoroutine(SWOOLE_HOOK_CURL)來開啟 (@matyhtf) (@Yurunsoft)
    • 使用PHP代碼實現exec/shell_exec的協程化 (#2657) (@Yurunsoft)
    • 開啟RuntimeHook時, 將替換函數array_walkarray_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的兩個方法getOption 和 setOption (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)

    • 底層使用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

[admin ]

來源:OsChina
連結:https://www.oschina.net/news/108129/swoole-4-4-released
Swoole 4.4 正式版已發布,包含大量更新已經有300次圍觀

http://coctec.com/news/all/show-post-209505.html