日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用webstorm做一个跑马灯_用Workman做一个聊天室

發(fā)布時(shí)間:2024/10/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用webstorm做一个跑马灯_用Workman做一个聊天室 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

php中文網(wǎng)最新課程

每日17點(diǎn)準(zhǔn)時(shí)技術(shù)干貨分享

為什么要寫這篇文章?

我學(xué)習(xí)Workman好幾次了,每次都失敗(沒做成想要的功能,原諒我比較笨)。但是這次也花了好幾個(gè)小時(shí),把之前沒做成的功能實(shí)現(xiàn)了。

其實(shí)就是兩個(gè)簡單的功能:

一對(duì)一發(fā)送消息,廣播消息(群聊)。

這個(gè)功能用swoole早都實(shí)現(xiàn)了,也是由于之前一直想用 think-worker 的原因,想想還是得自己琢磨才行,人家做好的框架或許是個(gè)閹割版。

別問我為什么不用swoole,因?yàn)?workman 可以在Windows中運(yùn)行。

(1)首先,得簡單說說 thinkphp+workerman 的安裝。

安裝 thinkphp5.1

composer create-project topthink/think=5.1.x-dev tp5andworkman

安裝 think-worker

composer require topthink/think-worker=2.0.*

直接安裝 workman

composer require workerman/workerman

(2)我們先看 think-worker 的代碼

config/worker_server.php

先來個(gè)服務(wù)器廣播消息的示例,每10秒鐘定時(shí)廣播一條消息

'onWorkerStart'? => function ($worker) {

????\Workerman\Lib\Timer::add(10, function()use($worker){

????????// 遍歷當(dāng)前進(jìn)程所有的客戶端連接,發(fā)送自定義消息

????????foreach($worker->connections as $connection){

????????????$send['name'] = '系統(tǒng)信息';

????????????$send['content'] = '這是一個(gè)定時(shí)任務(wù)信息';

????????????$send['time'] = time();

????????????$connection->send(json_encode($send));

????????}

????});

}

但是在 onMessage 時(shí),我們獲取不到 $worker 對(duì)象,所以無法廣播消息。

'onMessage'????? => function ($connection, $data) {

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

????$send['name'] = '廣播數(shù)據(jù)';

????$send['content'] = $origin['content'];

????$message = json_encode($send);

????foreach($worker->connections as $connection)

????{

????????$connection->send($message);

????}

}

嘗試了各種方法,貌似都不行

'onMessage'????? => function ($connection, $data)use($worker) {

????// 這樣是獲取不到 $worker 對(duì)象的

????// ...省略代碼

}

所以只能拋棄 thinkphp 給我們封裝的 think-worker 框架,得自己寫,(或者修改框架內(nèi)部代碼)

修改框架內(nèi)部的代碼:

/vendor/topthink/think-worker/src/command/Server.php

主要是把 onMessage 方法自己加進(jìn)去

use() 就是把外部變量傳遞到函數(shù)內(nèi)部使用,或者使用global $worker

$worker = new Worker($socket, $context);

$worker->onMessage = function ($connection, $data)use($worker) {

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

????$send['name'] = '廣播數(shù)據(jù)';

????$send['content'] = $origin['content'];

????$send['uid'] = $connection->uid;

????$message = json_encode($send);

????foreach($worker->connections as $connection)

????{

????????$connection->send($message);

????}

};

這樣,我們就能夠獲取到 $worker 對(duì)象了

$worker->onMessage = function ($connection, $data)use($worker) { ... }

(3)$connection 綁定 uid

其實(shí)你早都已經(jīng)看出,$worker->connections 獲取到的是當(dāng)前所有用戶的連接,connections 即為其中一個(gè)鏈接。

記錄websocket連接時(shí)間:

$worker->onConnect = function ($connection) {

????$connection->login_time = time();

};

獲取websocket連接時(shí)間:

$worker->onMessage = function ($connection, $data)use($worker) {

????$login_time = $connection->login_time;

};

由此可以看出,我們可以把數(shù)據(jù)綁定到 $connection 連接的一個(gè)屬性,例如:

$connection->uid = $uid;

當(dāng)JavaScript端在連接websocket服務(wù)器成功后,即把自己的 uid 立馬發(fā)送服務(wù)端綁定:

$worker->onMessage = function ($connection, $data)use($worker) {

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

????if(array_key_exists('bind',$origin)){

????????$connection->uid = $origin['uid'];

????}

};

(4)單播發(fā)送消息,即自定義發(fā)送

$worker->onMessage = function ($connection, $data)use($worker) {

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

????$sendTo = $origin['sendto']; // 需要發(fā)送的對(duì)方的uid

????$content = $origin['content']; // 需要發(fā)送到對(duì)方的內(nèi)容

????foreach($worker->connections as $connection)

????{

????????if( $connection->uid == $sendTo){

????????????$connection->send($content);

????????}

????}

};

到此,已經(jīng)完成基于 workman 的自定義對(duì)象發(fā)送消息。

由于該php文件存放于composer中,只需要把該文件復(fù)制出來,放到application/command,修改命名空間,即可保存到自己的項(xiàng)目中

(5)對(duì)比swoole

1、workman可以在windows系統(tǒng)中運(yùn)行,swoole則不能。

2、workman:$worker->connections獲取所有連接,$connection->id獲取自己的連接id;swoole:$server->connections獲取所有連接,$connection->fd獲取自己的連接id。

3、workman啟動(dòng)時(shí)執(zhí)行 onWorkerStart 方法,可以把定時(shí)器寫入到里面;swoole 使用 WorkerStart 啟動(dòng)定時(shí)器。

僅僅于聊天室或者定時(shí)器而言,workman 還是比較方便的。

-END-

聲明:本文選自「?php中文網(wǎng)?」,搜索「 phpcnnew 」即可關(guān)注!

總結(jié)

以上是生活随笔為你收集整理的用webstorm做一个跑马灯_用Workman做一个聊天室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。