swoole協(xié)程怎么開啟

swoole協(xié)程怎么開啟

swoole 2.0正式版發(fā)布了。2.0版本最大的更新是增加了對協(xié)程(Coroutine)的支持。正式版已同時(shí)支持PHP5和PHP7。

基于Swoole2.0協(xié)程PHP開發(fā)者可以已同步的方式編寫代碼,底層自動進(jìn)行協(xié)程調(diào)度,轉(zhuǎn)變?yōu)楫惒絀O。

解決了傳統(tǒng)異步編程嵌套回調(diào)的問題。 ? ?(推薦學(xué)習(xí): swoole視頻教程

與Node.js(ES6+)、Python等語言使用yield/generator、async/await的實(shí)現(xiàn)方式相比,Swoole協(xié)程無需修改代碼添加額外的關(guān)鍵詞。

與Go語言的goroutine相比,Swoole協(xié)程是內(nèi)置式的,應(yīng)用層代碼無需添加go關(guān)鍵詞啟動協(xié)程,只需要使用封裝好的協(xié)程客戶端即可,使用更簡單。另外Swoole協(xié)程的IO組件在底層內(nèi)置了超時(shí)機(jī)制,不需要使用復(fù)雜的select/chan/timer實(shí)現(xiàn)客戶端超時(shí)。

目前Swoole底層內(nèi)置的協(xié)程客戶端組件包括:udpclient、tcpclient、httpclient、redisclient、mysqlclient,基本涵蓋了開發(fā)者常用的幾種通信協(xié)議。協(xié)程組件只能在服務(wù)器的onConnect、onRequest、onReceive、onMessage 回調(diào)函數(shù)中使用。

使用 swole 協(xié)程

如何使用協(xié)程:

使用 go()(SwooleCoroutine::create() 的簡寫) 創(chuàng)建一個(gè)協(xié)程

在 go() 的回調(diào)函數(shù)中, 加入?yún)f(xié)程需要執(zhí)行的代碼, 注意是 非阻塞代碼

use?SwooleCoroutine?as?Co;?//?常用的縮寫方式  go(function?()?{?//?創(chuàng)建協(xié)程,?回調(diào)函數(shù)中寫需要在協(xié)程中執(zhí)行的代碼 ????echo?"daydaygo"; ????Co::sleep(1);?//?不能是阻塞代碼 });

協(xié)程

上文提到的, 使用 go() 創(chuàng)建一個(gè)協(xié)程

swoole server 中, 底層自動在 onRequet, onReceive, onConnect 等事件回調(diào)之前自動創(chuàng)建一個(gè)協(xié)程

開啟 enable_coroutine 參數(shù)后的影響范圍: 主要還包括 Timer 定時(shí)器

使用 task_enable_coroutine 開啟的協(xié)程版 Task 進(jìn)程, 會在 onTask 回調(diào)之前自動創(chuàng)建一個(gè)協(xié)程

進(jìn)程和進(jìn)程池支持開啟協(xié)程, 開啟后創(chuàng)建的子進(jìn)程會自動創(chuàng)建協(xié)程

//?tcp/udp?server,?可以在此基礎(chǔ)可封裝?rpc $s?=?new?SwooleServer(); //?http?server,?替代傳統(tǒng)的?fpm $s?=?new?SwooleHttpServer(); //?開啟?http2?支持:?https://wiki.swoole.com/wiki/page/326.html $s?=?new?SwooleHttpServer(); $s->set([ ????'open_http2_protocol'?=>?true, ]); //?進(jìn)而可以實(shí)現(xiàn)基于?http2?的服務(wù),?比如?grpc //?websocket?server $s?=?new?SwooleWebSocketServer();

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享