Swoole實測并發(fā)處理

server端:

/**

* Created by PhpStorm.

* User: aaa

* Date: 2019/6/4

* Time: 17:29

*/

class Server

{

private $serv;

? ? //構(gòu)造函數(shù)中完成基本設(shè)置,啟動Service

? ? public function __construct()

{

$this->serv = new swoole_server('0.0.0.0', 9001);

? ? ? ? $this->serv->set(array(

'worker_num'? => 8,

? ? ? ? ? ? ? ? 'daemonize'? => false, //是否作為守護進程,此配置一般配合log_file使用

? ? ? ? ? ? ? ? 'max_request' => 1000,

? ? ? ? ? ? ? ? 'log_file'? ? => './swoole.log',

? ? ? ? ? ? ? ? 'task_worker_num' => 8

? ? ? ? ));

? ? ? ? //Add lisene 設(shè)置功能監(jiān)聽與對應(yīng)回調(diào)函數(shù)

/*

* 必須給swoole_server綁定兩個回調(diào)函數(shù):onTask和onFinish芦瘾。這兩個回調(diào)函數(shù)分別用于執(zhí)行Task任務(wù)和處理Task任務(wù)的返回結(jié)果

*/

? ? ? ? $this->serv->on('Start', array($this, 'onStart'));

? ? ? ? $this->serv->on('Connect', array($this, 'onConnect'));

? ? ? ? $this->serv->on("Receive", array($this, 'onReceive'));

? ? ? ? $this->serv->on("Close", array($this, 'onClose'));

? ? ? ? $this->serv->on("Task", array($this, 'onTask'));

? ? ? ? $this->serv->on("Finish", array($this, 'onFinish'));

? ? ? ? //開啟

? ? ? ? $this->serv->start();

? ? }

public function onStart($serv) {

echo SWOOLE_VERSION . " onStart\n";

? ? }

public function onConnect($serv, $fd) {

echo $fd."Client Connect.\n";

? ? }

public function onReceive($serv, $fd, $from_id, $data) {

echo "Get Message From Client {$fd}:{$data}\n";

? ? ? ? // send a task to task worker.

? ? ? ? $param = array(

'fd' => $fd,

? ? ? ? ? ? 'sData'=> $data,

? ? ? ? );

? ? ? ? // start a task

? ? ? ? $result = $serv->task(json_encode($param));

? ? ? ? return $result;

? ? }

public function onClose($serv, $fd) {

echo "Client Close.\n";

? ? }

public function onTask($serv, $task_id, $from_id, $data) {

echo "This Task {$task_id} from Worker {$from_id}\n";

? ? ? ? echo "Data: {$data}\n";

? ? ? ? $proId = uniqid();

? ? ? ? $randomSec = random_int(1,2);

? ? ? ? sleep($randomSec);

? ? ? ? $fd = json_decode($data, true);

? ? ? ? $sData = $fd['sData'];

? ? ? ? $serv->send($fd['fd'], "Pro:{$proId} Data in Task {$task_id}? From Id is: {$from_id}? STRANSACTION: {$sData}? ? SEND COMP OK");

? ? ? ? return "\n=====Task {$task_id}'s result? SEND COMPLETED =====";

? ? }

public function onFinish($serv,$task_id, $data) {

$fd = json_decode($data, true);

? ? ? ? $serv->send($fd['fd'], "Task {$task_id}? Send Finish");

? ? ? ? echo "\nOK Task {$task_id} finish\n";

? ? ? ? echo "\n Ok Result: {$data}\n";

? ? }

}

$server = new server();


客戶端:

/**

* Created by PhpStorm.

* User: aaa

* Date: 2019/6/4

* Time: 22:43

*/

class Client

{

private $client;

? ? private $msgId;

? ? public function __construct() {

$this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);

? ? ? ? $this->client->on('Connect', array($this, 'onConnect'));

? ? ? ? $this->client->on('Receive', array($this, 'onReceive'));

? ? ? ? $this->client->on('Close', array($this, 'onClose'));

? ? ? ? $this->client->on('Error', array($this, 'onError'));

? ? }

public function connect() {

if(!$fp = $this->client->connect("127.0.0.1", 9001 , 1)) {

echo "Error: {$fp->errMsg}[{$fp->errCode}]\n";

? ? ? ? ? ? return;

? ? ? ? }

}

//connect之后,會調(diào)用onConnect方法

? ? public function onConnect($cli) {

//執(zhí)行發(fā)送

? ? ? ? $result =? $this->send("Client Sent Msg ID: ".$this->msgId);

? ? ? ? echo "\nClient got Server Response is ".$result;

? ? }

public function onClose($cli) {

echo "Client close connection\n";

? ? }

public function onError() {

}

public function onReceive($cli, $data) {

echo "\n Received From Server : ".$data."\n";

? ? ? ? //收到服務(wù)器推送消息后真友,關(guān)閉當前鏈路

? ? ? ? $cli->close();

? ? }

public function send($data) {

$result =? $this->client->send($data);

? ? ? return $result;

? ? }

public function isConnected($cli) {

return $this->client->isConnected();

? ? }

public function setMsgId($msgId){

$this->msgId = $msgId;

? ? }

}

//發(fā)送模擬請求100次

for($i=0;$i<100;$i++){

$client = new Client();

? ? $client->setMsgId($i);

? ? $client->connect();

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陪拘,一起剝皮案震驚了整個濱河市休傍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宠能,死亡現(xiàn)場離奇詭異,居然都是意外死亡磁餐,警方通過查閱死者的電腦和手機违崇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崖媚,“玉大人亦歉,你說我怎么就攤上這事恤浪〕┭疲” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵水由,是天一觀的道長荠呐。 經(jīng)常有香客問我,道長砂客,這世上最難降的妖魔是什么泥张? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮鞠值,結(jié)果婚禮上媚创,老公的妹妹穿的比我還像新娘。我一直安慰自己彤恶,他們只是感情好钞钙,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著声离,像睡著了一般芒炼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上术徊,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天本刽,我揣著相機與錄音,去河邊找鬼赠涮。 笑死子寓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的笋除。 我是一名探鬼主播斜友,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼株憾!你這毒婦竟也來了蝙寨?” 一聲冷哼從身側(cè)響起晒衩,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墙歪,沒想到半個月后听系,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡虹菲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年靠胜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毕源。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浪漠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霎褐,到底是詐尸還是另有隱情址愿,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布冻璃,位于F島的核電站响谓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏省艳。R本人自食惡果不足惜娘纷,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跋炕。 院中可真熱鬧赖晶,春花似錦、人聲如沸辐烂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棉圈。三九已至涩堤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分瘾,已是汗流浹背胎围。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留德召,地道東北人白魂。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像上岗,于是被迫代替她去往敵國和親福荸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容