Rumah rangka kerja php ThinkPHP 使用 Workman 做一个聊天室

使用 Workman 做一个聊天室

Jun 21, 2019 pm 02:52 PM
tp bilik sembang

使用 Workman 做一个聊天室

为什么要写这篇文章?

我学习Workman好几次了,每次都失败(没做成想要的功能,原谅我比较笨)。但是这次也花了好几个小时,把之前没做成的功能实现了。其实就是两个简单的功能:一对一发送消息,广播消息(群聊)。这个功能用swoole早都实现了,也是由于之前一直想用 think-worker 的原因,想想还是得自己琢磨才行,人家做好的框架或许是个阉割版。

别问我为什么不用swoole,因为 workman 可以在Windows中运行。

(1)首先,得简单说说 thinkphp+workerman 的安装。

安装 thinkphp5.1

composer create-project topthink/think=5.1.x-dev tp5andworkman
Salin selepas log masuk

安装 think-worker

composer require topthink/think-worker=2.0.*
Salin selepas log masuk

直接安装 workman

composer require workerman/workerman
Salin selepas log masuk

(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));
        }
    });
}
Salin selepas log masuk

但是在 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);
    }
}
Salin selepas log masuk

尝试了各种方法,貌似都不行

'onMessage'      => function ($connection, $data)use($worker) {
    // 这样是获取不到 $worker 对象的
    // ...省略代码
}
Salin selepas log masuk

所以只能抛弃 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);
    }
};
Salin selepas log masuk

这样,我们就能够获取到 $worker 对象了

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

(3)$connection 绑定 uid

其实你早都已经看出,$worker->connections 获取到的是当前所有用户的连接,connections 即为其中一个链接。

记录websocket连接时间:

$worker->onConnect = function ($connection) {
    $connection->login_time = time();
};
Salin selepas log masuk

获取websocket连接时间:

$worker->onMessage = function ($connection, $data)use($worker) {
    $login_time = $connection->login_time;
};
Salin selepas log masuk

由此可以看出,我们可以把数据绑定到 $connection 连接的一个属性,例如:

$connection->uid = $uid;
Salin selepas log masuk

当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'];
    }
};
Salin selepas log masuk

(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);
        }
    }
};
Salin selepas log masuk

到此,已经完成基于 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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan fungsi bilik sembang mudah menggunakan MySQL dan Java Bagaimana untuk melaksanakan fungsi bilik sembang mudah menggunakan MySQL dan Java Sep 21, 2023 pm 05:13 PM

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.

Bagaimana untuk membangunkan ruang sembang Websocket menggunakan bahasa Go Bagaimana untuk membangunkan ruang sembang Websocket menggunakan bahasa Go Dec 14, 2023 pm 01:46 PM

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

Bina ruang sembang masa nyata berdasarkan JavaScript Bina ruang sembang masa nyata berdasarkan JavaScript Aug 10, 2023 pm 11:18 PM

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 TP6 Think-Swoole RPC Pengoptimuman prestasi dan penyahpepijatan perkhidmatan TP6 Think-Swoole RPC Oct 12, 2023 am 11:16 AM

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 Panduan Pembangunan Bilik Sembang ThinkPHP6: Melaksanakan Fungsi Komunikasi Masa Nyata Aug 12, 2023 pm 02:31 PM

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

Membangunkan fungsi bilik sembang menggunakan php dan Websocket Membangunkan fungsi bilik sembang menggunakan php dan Websocket Dec 02, 2023 am 11:08 AM

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

Swole in action: cepat buat ruang sembang berdasarkan WebSocket Swole in action: cepat buat ruang sembang berdasarkan WebSocket Jun 14, 2023 pm 04:20 PM

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

Kebolehskalaan tinggi dan penyebaran perkhidmatan TP6 Think-Swoole RPC Kebolehskalaan tinggi dan penyebaran perkhidmatan TP6 Think-Swoole RPC Oct 12, 2023 am 11:07 AM

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

See all articles