使用 Workman 做一个聊天室
为什么要写这篇文章?
我学习Workman好几次了,每次都失败(没做成想要的功能,原谅我比较笨)。但是这次也花了好几个小时,把之前没做成的功能实现了。其实就是两个简单的功能:一对一发送消息,广播消息(群聊)。这个功能用swoole早都实现了,也是由于之前一直想用 think-worker 的原因,想想还是得自己琢磨才行,人家做好的框架或许是个阉割版。
别问我为什么不用swoole,因为 workman 可以在Windows中运行。
(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
先来个服务器广播消息的示例,每10秒钟定时广播一条消息
'onWorkerStart' => function ($worker) { \Workerman\Lib\Timer::add(10, function()use($worker){ // 遍历当前进程所有的客户端连接,发送自定义消息 foreach($worker->connections as $connection){ $send['name'] = '系统信息'; $send['content'] = '这是一个定时任务信息'; $send['time'] = time(); $connection->send(json_encode($send)); } }); }
但是在 onMessage 时,我们获取不到 $worker 对象,所以无法广播消息。
'onMessage' => function ($connection, $data) { $origin = json_decode($data,true); $send['name'] = '广播数据'; $send['content'] = $origin['content']; $message = json_encode($send); foreach($worker->connections as $connection) { $connection->send($message); } }
尝试了各种方法,貌似都不行
'onMessage' => function ($connection, $data)use($worker) { // 这样是获取不到 $worker 对象的 // ...省略代码 }
所以只能抛弃 thinkphp 给我们封装的 think-worker 框架,得自己写,(或者修改框架内部代码)
修改框架内部的代码:/vendor/topthink/think-worker/src/command/Server.php
,主要是把 onMessage 方法自己加进去
use() 就是把外部变量传递到函数内部使用,或者使用global $worker
$worker = new Worker($socket, $context); $worker->onMessage = function ($connection, $data)use($worker) { $origin = json_decode($data,true); $send['name'] = '广播数据'; $send['content'] = $origin['content']; $send['uid'] = $connection->uid; $message = json_encode($send); foreach($worker->connections as $connection) { $connection->send($message); } };
这样,我们就能够获取到 $worker 对象了
$worker->onMessage = function ($connection, $data)use($worker) { ... }
(3)$connection 绑定 uid
其实你早都已经看出,$worker->connections 获取到的是当前所有用户的连接,connections 即为其中一个链接。
记录websocket连接时间:
$worker->onConnect = function ($connection) { $connection->login_time = time(); };
获取websocket连接时间:
$worker->onMessage = function ($connection, $data)use($worker) { $login_time = $connection->login_time; };
由此可以看出,我们可以把数据绑定到 $connection 连接的一个属性,例如:
$connection->uid = $uid;
当JavaScript端在连接websocket服务器成功后,即把自己的 uid 立马发送服务端绑定:
$worker->onMessage = function ($connection, $data)use($worker) { $origin = json_decode($data,true); if(array_key_exists('bind',$origin)){ $connection->uid = $origin['uid']; } };
(4)单播发送消息,即自定义发送
$worker->onMessage = function ($connection, $data)use($worker) { $origin = json_decode($data,true); $sendTo = $origin['sendto']; // 需要发送的对方的uid $content = $origin['content']; // 需要发送到对方的内容 foreach($worker->connections as $connection) { if( $connection->uid == $sendTo){ $connection->send($content); } } };
到此,已经完成基于 workman 的自定义对象发送消息。
由于该php文件存放于composer中,只需要把该文件复制出来,放到application/command
,修改命名空间,即可保存到自己的项目中
(5)对比swoole
1、workman可以在windows系统中运行,swoole则不能。
2、workman:$worker->connections获取所有连接,$connection->id获取自己的连接id;swoole:$server->connections获取所有连接,$connection->fd获取自己的连接id。
3、workman启动时执行 onWorkerStart 方法,可以把定时器写入到里面;swoole 使用 WorkerStart 启动定时器。
仅仅于聊天室或者定时器而言,workman 还是比较方便的。
更多ThinkPHP相关技术文章,请访问ThinkPHP使用教程栏目进行学习!
Atas ialah kandungan terperinci 使用 Workman 做一个聊天室. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara menggunakan MySQL dan Java untuk melaksanakan fungsi bilik sembang ringkas Pengenalan: Dengan kelaziman media sosial hari ini, orang ramai semakin bergantung pada sembang dalam talian untuk berkomunikasi dan berkongsi maklumat. Bagaimana untuk melaksanakan fungsi bilik sembang mudah menggunakan MySQL dan Java adalah projek yang sangat menarik dan praktikal. Artikel ini akan memperkenalkan cara menggunakan MySQL dan Java untuk melaksanakan fungsi ini, dan menyediakan contoh kod khusus. 1. Bina pangkalan data Pertama, kita perlu mencipta pangkalan data dalam MySQL untuk menyimpan maklumat berkaitan bilik sembang.

Cara menggunakan bahasa Go untuk membangunkan ruang sembang Websocket Websocket ialah protokol komunikasi masa nyata yang membolehkan komunikasi dua hala antara pelayan dan pelanggan dengan mewujudkan sambungan. Websocket ialah pilihan yang sangat baik apabila membangunkan bilik sembang kerana ia membolehkan pertukaran mesej masa nyata dan memberikan prestasi yang cekap. Artikel ini akan memperkenalkan cara membangunkan ruang sembang Websocket yang mudah menggunakan bahasa Go dan menyediakan beberapa contoh kod khusus. 1. Penyediaan 1. Pasang Go

Membina bilik sembang masa nyata berdasarkan JavaScript Dengan perkembangan pesat Internet, orang ramai memberi lebih banyak perhatian kepada pemesejan segera dan pengalaman interaktif masa nyata. Sebagai alat pemesejan segera yang biasa, bilik sembang masa nyata adalah sangat penting kepada individu dan perniagaan. Artikel ini akan memperkenalkan cara membina ruang sembang masa nyata yang ringkas menggunakan JavaScript dan memberikan contoh kod yang sepadan. Mula-mula kami memerlukan halaman hadapan sebagai antara muka UI ruang sembang. Berikut ialah contoh struktur HTML mudah: <!DOCTYPE

Pengoptimuman prestasi dan penyahpepijatan perkhidmatan TP6Think-SwooleRPC 1. Pengenalan Dengan perkembangan pesat Internet, pengkomputeran teragih telah menjadi bahagian yang amat diperlukan dalam pembangunan perisian moden. Dalam pengkomputeran teragih, RPC (RemoteProcedureCall, Remote Procedure Call) ialah mekanisme komunikasi yang biasa digunakan di mana panggilan kaedah merentas rangkaian boleh dilaksanakan. Think-Swoole, sebagai rangka kerja PHP berprestasi tinggi, boleh menyokong perkhidmatan RPC dengan baik. tetapi

Panduan Pembangunan Bilik Sembang ThinkPHP6: Melaksanakan Fungsi Komunikasi Masa Nyata Pengenalan: Dengan perkembangan pesat Internet, permintaan untuk komunikasi masa nyata juga semakin meningkat. Sebagai kaedah biasa komunikasi masa nyata, bilik sembang telah mendapat perhatian dan penggunaan yang meluas. Artikel ini akan memberikan anda kaedah yang mudah dan pantas untuk melaksanakan fungsi komunikasi masa nyata dengan menggunakan rangka kerja ThinkPHP6. 1. Konfigurasi persekitaran: Sebelum memulakan, kita perlu mengkonfigurasi persekitaran pembangunan. Pastikan anda telah memasang rangka kerja PHP dan ThinkPHP6. Pada masa yang sama, artikel ini akan membuat

Menggunakan PHP dan Websocket untuk membangunkan fungsi bilik sembang Pengenalan: Dengan perkembangan pesat Internet, bilik sembang telah menjadi salah satu cara penting untuk orang ramai berkomunikasi dan bersosial dalam kehidupan seharian. Menggunakan teknologi PHP dan Websocket untuk membangunkan fungsi bilik sembang boleh mencapai komunikasi dua hala masa nyata dan memberikan pengguna pengalaman sembang yang lebih lancar dan mudah. Artikel ini akan memperkenalkan cara menggunakan PHP dan Websocket untuk melaksanakan ruang sembang ringkas dan memberikan contoh kod khusus. 1. Persediaan: Sebelum memulakan pembangunan, kita perlu memastikan

Dalam era Internet, bilik sembang telah menjadi tempat penting untuk orang ramai berkomunikasi dan bersosial. Kemunculan teknologi WebSocket telah menjadikan komunikasi masa nyata lebih lancar dan stabil. Hari ini, kami memperkenalkan cara menggunakan rangka kerja Swoole untuk membina ruang sembang dengan cepat berdasarkan WebSocket. Swoole ialah rangka kerja komunikasi rangkaian coroutine PHP berprestasi tinggi, ditulis dalam bahasa C, menyepadukan IO tak segerak, coroutine, komunikasi rangkaian dan fungsi lain, menjadikan kod PHP seperti Node.js

TP6 (ThinkPHP6) ialah rangka kerja sumber terbuka berdasarkan PHP, yang mempunyai ciri-ciri berskala tinggi dan penggunaan teragih. Artikel ini akan memperkenalkan cara menggunakan TP6 dengan sambungan Swoole untuk membina perkhidmatan RPC berskala tinggi dan memberikan contoh kod khusus. Pertama, kita perlu memasang sambungan TP6 dan Swoole. Jalankan arahan berikut dalam baris arahan: composerrequiretopthink/thinkpeclinstallswo
