什么是swoole
swoole是PHP的異步条舔、并行枫耳、高性能網(wǎng)絡(luò)通信引擎,使用純C語言編寫孟抗,提供了PHP語言的異步多線程服務(wù)器迁杨,異步TCP/UDP網(wǎng)絡(luò)客戶端,異步MySQL凄硼,異步Redis铅协,數(shù)據(jù)庫(kù)連接池,AsyncTask摊沉,消息隊(duì)列狐史,毫秒定時(shí)器,異步文件讀寫坯钦,異步DNS查詢预皇。 Swoole內(nèi)置了Http/WebSocket服務(wù)器端/客戶端、Http2.0服務(wù)器端婉刀。
Swoole可以廣泛應(yīng)用于互聯(lián)網(wǎng)吟温、移動(dòng)通信、企業(yè)軟件突颊、云計(jì)算鲁豪、網(wǎng)絡(luò)游戲、物聯(lián)網(wǎng)(IOT)律秃、車聯(lián)網(wǎng)爬橡、智能家居等領(lǐng)域。 使用PHP+Swoole作為網(wǎng)絡(luò)通信框架棒动,可以使企業(yè)IT研發(fā)團(tuán)隊(duì)的效率大大提升糙申,更加專注于開發(fā)創(chuàng)新產(chǎn)品。隨著我們
我們?yōu)槭裁从胹woole
用戶打開了我們的網(wǎng)站船惨。他要做的就是勾選需要發(fā)郵件的代理商列表柜裸,然后把結(jié)算郵件發(fā)出去。
假如我們需要發(fā)1封郵件粱锐,我們寫個(gè)函數(shù)執(zhí)行即可疙挺。考慮到網(wǎng)絡(luò)可能會(huì)稍微有點(diǎn)延遲怜浅,但是是可以接受的铐然,用戶會(huì)乖乖等你的網(wǎng)頁發(fā)完郵件了再關(guān)閉網(wǎng)頁蔬崩。
假如我們要發(fā)布10封郵件,用一個(gè)for循環(huán)搀暑,循環(huán)10遍執(zhí)行發(fā)郵件操作沥阳。這時(shí)候,也許10倍的網(wǎng)絡(luò)延遲會(huì)讓用戶稍微有點(diǎn)不耐煩自点,但勉強(qiáng)可以等吧沪袭。
假如要發(fā)100封郵件,for循環(huán)100遍樟氢,用戶直接揭竿而起冈绊,什么破網(wǎng)站!
但實(shí)際上埠啃,我們很可能有超過1萬的郵件死宣。怎么處理這個(gè)延遲的問題?
答案就是用異步碴开。把“發(fā)郵件”這個(gè)操作封裝毅该,然后后臺(tái)異步地執(zhí)行1萬遍。這樣的話潦牛,用戶提交網(wǎng)頁后眶掌,他所等待的時(shí)間只是“把發(fā)郵件任務(wù)請(qǐng)求推送進(jìn)隊(duì)列里”的時(shí)間。而我們的后臺(tái)服務(wù)將在用戶看不見的地方跑巴碗。而swoole就為我們實(shí)現(xiàn)了異步隊(duì)列處理及并發(fā)等問題朴爬。
如何使用
1、安裝swoole
有兩種安裝方式橡淆,一種是先下載安裝包召噩,傳到服務(wù)器(記住一定是linux服務(wù)器)上,然后解壓逸爵,然后先cd到服務(wù)器的安裝包的位置具滴,然后執(zhí)行
phpize./configuremakesudomakeinstall
系統(tǒng)就會(huì)自動(dòng)安裝,如果提示phpize不存在的話师倔,就需要安裝一下phpize.
另一種方式直接執(zhí)行
peclinstallswoole
用這種方式可以自動(dòng)下載安裝构韵。
我采取的是第二種方式噢。
安裝完成趋艘,需要更改php.ini的配置疲恢,將
extension=swoole.so
放在這個(gè)配置中,然后重啟nginx致稀。
完成以后執(zhí)行
php -m
查看是否有swoole冈闭。有swoole說明安裝成功俱尼。
2.啟動(dòng)server
之前看文檔我一直以為swoole是個(gè)框架抖单,需要我們配置然后設(shè)置端口訪問,其實(shí)不是,swoole是php的擴(kuò)展矛绘,我們只需要在我們的項(xiàng)目中增加server.php,或者其他的名字耍休,里面的代碼簡(jiǎn)單點(diǎn)可以按照文檔上來寫,如下:
//創(chuàng)建Server對(duì)象货矮,監(jiān)聽 127.0.0.1:9501端口$serv =newswoole_server("127.0.0.1",9501);//監(jiān)聽連接進(jìn)入事件$serv->on('connect',function($serv, $fd){echo"Client: Connect.\n";});//監(jiān)聽數(shù)據(jù)發(fā)送事件$serv->on('receive',function($serv, $fd, $from_id, $data){? ? $serv->send($fd,"Server: ".$data);});//監(jiān)聽連接關(guān)閉事件$serv->on('close',function($serv, $fd){echo"Client: Close.\n";});//啟動(dòng)服務(wù)器$serv->start();
這里就創(chuàng)建了一個(gè)TCP服務(wù)器羊精,監(jiān)聽本機(jī)9501端口,你也可以改成其他的端口號(hào)囚玫,只要你的服務(wù)器可以支持這個(gè)端口喧锦。
服務(wù)器端的server必須運(yùn)行起來我們才能使用swoole,異步執(zhí)行抓督。如何運(yùn)行呢燃少?我們cd到你的項(xiàng)目下server.php 所在的文件夾,然后執(zhí)行
phpserver.php
如何測(cè)試成功呢铃在?我們可以關(guān)掉這個(gè)客戶端阵具,重新打開連接服務(wù)器,然后執(zhí)行
telnet127.0.0.19501helloServer:hello
如果是這樣子說明成功了定铜。
需要注意的是我們?nèi)绻薷牧藄erver.php,必須斷掉之前阳液,然后重新打開。
我這邊寫了一個(gè)腳本來斷掉之前的揣炕,起名stop.sh
#! /bin/bashps -eaf |grep"server.php"| grep -v"grep"| awk'{print $2}'|xargskill-9
這需要放在和server.php同一個(gè)文件夾帘皿。
我們需要cd到這個(gè)文件夾,執(zhí)行sh stop.sh
3畸陡、client
這個(gè)是可以在瀏覽器上執(zhí)行的矮烹,我們見一個(gè)client.php,代碼如下:
$client =newswoole_client(SWOOLE_SOCK_TCP);//連接到服務(wù)器if(!$client->connect('127.0.0.1',9501,0.5)){die("connect failed.");}//向服務(wù)器發(fā)送數(shù)據(jù)if(!$client->send("hello world")){die("send failed.");}//從服務(wù)器接收數(shù)據(jù)$data = $client->recv();if(!$data){die("recv failed.");}echo$data;//關(guān)閉連接$client->close();
創(chuàng)建一個(gè)TCP的同步客戶端罩锐,此客戶端可以用于連接到我們server服務(wù)器奉狈。向服務(wù)器端發(fā)送一個(gè)hello world字符串,服務(wù)器會(huì)返回一個(gè) Server: hello world字符串涩惑。
以上是swoole簡(jiǎn)單的安裝和連同仁期。
yii2集成swoole
有需要的朋友可以去yii2-swoole這個(gè)地址下載,yii2集成swoole的代碼竭恬。
參考資料: