Swoole
雖然在2016
年就支援了協程特性,但由於底層是基於setjmp/longjmp
實現的stackless
方案。因此在某些情境下,如call_user_func
、array_map
、__destruct
中無法使用協程。大型應用程式中邏輯非常複雜,多人協作的團隊中,開發人員很容易踩到坑。在禁止情境中使用協程API
會出現各種莫名其妙的問題發生。限制了協程的應用範圍。
新版本4.0
基於boost.context 1.60
彙編代碼實現了全新的協程核心。在儲存PHP
函數調用棧的基礎上,增加了C
棧的上下文儲存。實現了對所有PHP
文法的支援。現在在任意PHP
的函數,包括call_user_func
、反射、魔術方法、array_map
中均可使用協程。
現在可以在PHP
代碼中任意位置使用協程,開發人員不再需要擔心使用情境問題。4.0
版本我們與SwooleDistributed
/Swoft
/EasySwoole
等架構作者進行了緊密合作,在大量項目中進行了灰階試用。穩定性和健壯性均已達到工業級的水準。完全可用於大型項目的生產環境中。
go(function() { array_map("test", array("func start\n")); echo "co end\n";}); function test($p) { echo $p; co::sleep(1); echo "func end \n";}
4.0
分支使用了
C++11
標準,建議使用
gcc-4.8
或更高版本。
全域變數隔離
新版本中底層對全域變數進行了隔離,現在可以使用Swoole\Process
建立多個Swoole\Server
執行個體了。
for ($i = 0; $i < 2; $i++){ $p = new swoole_process(function () use ($i) { $port = 9501 + $i; $http = new swoole_http_server("127.0.0.1", $port); $http->on("start", function ($server) use ($port) { echo "Swoole http server is started at http://127.0.0.1:{$port}\n"; }); $http->on("request", function ($request, $response) { $response->header("Content-Type", "text/plain"); $response->end("Hello World\n"); }); $http->start(); }, false, false); $p->start();}
其他更新
- 修複
http2
伺服器無法向Chrome
瀏覽器用戶端發送超過16K
資料的問題
- 修複
BASE
模式下Task
進程無法重啟的問題
- 增加
Channel->peek
方法,用於窺視資料
- 修複
Server->pause/resume
在SWOOLE_PROCESS
下無法使用的問題
- 移除
Linux AIO
,現在無論如何設定都使用線程池實現非同步檔案IO
- 支援
MySQL
預存程序
下載 4.0
- GITHUB:https://github.com/swoole/swo...
- 開源中國:https://gitee.com/swoole/swoo...
- PECL:https://pecl.php.net/package/...