swoole 2.0正式版發布了。2.0版本最大的更新是增加了對協程(Coroutine)的支持。正式版已同時支持php5和PHP7。
基于Swoole2.0協程PHP開發者可以已同步的方式編寫代碼,底層自動進行協程調度,轉變為異步IO。解決了傳統異步編程嵌套回調的問題。? ? ? ? ? ? ?(推薦學習: swoole視頻教程)
與Node.JS(es6+)、python等語言使用yield/generator、async/await的實現方式相比,Swoole協程無需修改代碼添加額外的關鍵詞。
與go語言的goroutine相比,Swoole協程是內置式的,應用層代碼無需添加go關鍵詞啟動協程,只需要使用封裝好的協程客戶端即可,使用更簡單。另外Swoole協程的IO組件在底層內置了超時機制,不需要使用復雜的select/chan/timer實現客戶端超時。
目前Swoole底層內置的協程客戶端組件包括:udpclient、tcpclient、httpclient、redisclient、mysqlclient,基本涵蓋了開發者常用的幾種通信協議。協程組件只能在服務器的onConnect、onRequest、onReceive、onMessage 回調函數中使用。
使用示例
$server?=?new?SwooleHttpServer('127.0.0.1',?9501); /* ????觸發on?request事件時,SWOOLE會開辟一個協程棧,對協程棧進行初始化 ?*/ $server->on('Request',?function?($request,?$response)?{ ????$tcp_cli?=?new?SwooleCoroutineClient(SWOOLE_SOCK_TCP); ????/** ????????client在調用connect函數后,SWOOLE會將PHP上下文信息保存到當前棧內 ????????然后將協程掛起,待確認連接成功后,觸發epoll事件,然后協程切換 ????????恢復PHP上下文信息,返回結果,繼續執行PHP代碼 ?????*/ ????if?($tcp_cli->connect('127.0.0.1',?9906)?===?false)?{ ????????$response->end("connect?server?failed."); ????????return; ????} ????$tcp_cli->send('test?for?the?coro'); ????/* ????????client在調用recv函數后,SWOOLE會將PHP上下文信息保存到當前棧內 ????????然后將協程掛起待后端svr回包,觸發epoll事件,然后協程切換 ????????恢復PHP上下文信息,返回結果,繼續執行PHP代碼 ????????如果后端在設定的超時時間內,未能回包,返回false ????????client的errCode定為110 ?????*/ ????$ret?=?$tcp_cli->recv(100); ????$tcp_cli->close(); ????if?($ret)?{ ????????$response->end("?swoole?response?is?ok"); ????}?else?{ ????????$response->end("?recv?failed?error?:?{$tcp_cli->errCode}"); ????} }); $server->start();
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END