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 回呼函數中使用。
使用swole 協程
如何使用協程:
使用go()( \Swoole\Coroutine::create() 的簡寫) 建立一個協程
#在go() 的回呼函數中, 加入協程需要執行的程式碼, 注意是非阻塞程式碼
use Swoole\Coroutine as Co; // 常用的缩写方式 go(function () { // 创建协程, 回调函数中写需要在协程中执行的代码 echo "daydaygo"; Co::sleep(1); // 不能是阻塞代码 });
協程
上文提到的, 使用go() 建立一個協程
swoole server 中, 底層自動在onRequet, onReceive, onConnect 等事件回呼之前自動建立一個協程
開啟enable_coroutine 參數後的影響範圍: 主要還包括Timer 定時器
使用task_enable_coroutine 開啟的協程版Task 程序,會在onTask 回呼之前自動建立一個協程
進程和進程池支援開啟協程, 開啟後建立的子程序會自動建立協程
// tcp/udp server, 可以在此基础可封装 rpc $s = new \Swoole\Server(); // http server, 替代传统的 fpm $s = new \Swoole\Http\Server(); // 开启 http2 支持: https://wiki.swoole.com/wiki/page/326.html $s = new \Swoole\Http\Server(); $s->set([ 'open_http2_protocol' => true, ]); // 进而可以实现基于 http2 的服务, 比如 grpc // websocket server $s = new \Swoole\WebSocket\Server();
以上是swoole協程怎麼開啟的詳細內容。更多資訊請關注PHP中文網其他相關文章!