一.創(chuàng)建服務(wù)端
//默認(rèn)tcp協(xié)議腥例,在我們的硬件通信中使用較多
$server = new Swoole\Server("0.0.0.0",9800);
//設(shè)置進(jìn)程數(shù)羊异,必須為正正數(shù)草雕,會(huì)產(chǎn)生2+worker_num個(gè)數(shù)個(gè)進(jìn)程
$server->set(['worker_num'=>2]);
//事件監(jiān)聽
//1卿泽。監(jiān)聽連接
//$server是Swoole\Server對(duì)象
//$fd是連接的文件描述符奋救,發(fā)送數(shù)據(jù)/關(guān)閉連接時(shí)需要此參數(shù)
//$reactorId來(lái)自哪個(gè)Reactor線程,第三個(gè)參數(shù)
$server->on('connect',function($server, $fd){
echo "已連接到服務(wù)器:{$fd}".PHP_EOL;
});
//2玫坛。接收到客戶端消息
//$server结笨,Server對(duì)象
//$fd,TCP客戶端連接的唯一標(biāo)識(shí)符
//$reactor_id,TCP連接所在的Reactor線程ID
//$data炕吸,收到的數(shù)據(jù)內(nèi)容伐憾,可能是文本或者二進(jìn)制內(nèi)容
//參數(shù)$fd是唯一標(biāo)識(shí),用于區(qū)分不同的客戶端赫模,同時(shí)該參數(shù)是1-1600萬(wàn)之間可以復(fù)用的整數(shù)树肃。簡(jiǎn)單解釋下復(fù)用:假設(shè)現(xiàn)在客戶端1、2瀑罗、3處于連接中胸嘴,客戶端4要連接的話$fd就是4,但是不巧的是客戶端3連接不穩(wěn)定斩祭,斷掉了劣像,客戶端4連接到server的話,$fd就是3摧玫,這樣看的話1600W個(gè)連接夠用嗎耳奕?單機(jī)業(yè)務(wù)百萬(wàn)連接,已經(jīng)是很厲害了诬像,不用擔(dān)心
$server->on('receive',function($server, int $fd, int $reactor_id, string $data){
echo "接收到客戶端消息:{$fd}".PHP_EOL;
$server->send($fd, "Server: ".$data);
});
//3屋群。連接關(guān)閉
$server->on('close',function(){
echo "已關(guān)閉連接".PHP_EOL;
});
//開啟服務(wù)
$server->start();
二.創(chuàng)建同步客戶端
同步client是同步阻塞的。一整套connect->send()->rev()->close()是同步進(jìn)行的颅停。如果需要大量的數(shù)據(jù)處理谓晌,后臺(tái)不能在規(guī)定的時(shí)間內(nèi)返回?cái)?shù)據(jù)會(huì)導(dǎo)致接收超時(shí),并且因?yàn)槭峭綀?zhí)行所以需要等待后臺(tái)數(shù)據(jù)的返回癞揉。
$client = new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_SYNC);
$client->connect('127.0.0.1',9800);
//發(fā)送數(shù)據(jù)纸肉,需要做粘包處理
$client->send('我是客戶端');
//接收數(shù)據(jù)
var_dump($client->recv());
//關(guān)閉,關(guān)閉不能這么草率喊熟,需要做應(yīng)答
$client->close();
三.創(chuàng)建異步客戶端
當(dāng)設(shè)定swoole_client為異步模式后柏肪,swoole_client就不能使用recv方法了,而需要通過(guò)on方法提供指定的回調(diào)函數(shù)芥牌,然后在回調(diào)函數(shù)當(dāng)中處理烦味,也就是小明等待奶茶(在4中解釋)做好了異步通知,消息發(fā)送跟接收并不是同步運(yùn)行的。
$client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//必須注冊(cè)事件壁拉。注冊(cè)所有事件
$client->on("connect", function(swoole_client $cli) {
$cli->send("GET / HTTP/1.1\r\n\r\n");
});
//異步客戶端發(fā)送消息后不能立即收到回復(fù)谬俄,但是會(huì)首先注冊(cè)好監(jiān)聽事件,收到消息后再處理
$client->on("receive", function(swoole_client $cli, $data){
echo "Receive: $data";
//$cli->send(str_repeat('A', 100)."\n");
//sleep(1);
});
$client->on("error", function(swoole_client $cli){
echo "error\n";
});
$client->on("close", function(swoole_client $cli){
echo "Connection close\n";
});
$client->connect('127.0.0.1', 9800);
echo '寫日志';
echo '調(diào)用api';