이 글을 쓰는 이유는 무엇인가요?
워크맨을 여러번 배웠지만 매번 실패했습니다. (원하는 기능을 이루지 못했어요, 바보같아서 용서해주세요). 하지만 이번에도 이전에 수행되지 않았던 기능을 구현하는 데 몇 시간이 걸렸습니다. 실제로 간단한 기능은 1대1 메시지 보내기와 메시지 방송(그룹 채팅) 두 가지가 있습니다. 이 기능은 오랫동안 swoole로 구현해 왔고, 늘 Think-Worker를 사용하고 싶었기 때문이기도 합니다. 버전.
workman은 Windows에서 실행할 수 있기 때문에 왜 swoole을 사용하지 않는지 묻지 마십시오.
(1) 먼저 thinkphp+workerman 설치에 대해 간략히 설명하겠습니다.
thinkphp5.1 설치
composer create-project topthink/think=5.1.x-dev tp5andworkman
install 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 메소드를 직접 추가하세요/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
전역 $worker
rrreee를 사용하세요. 이런 식으로 $worker 개체
rrreee
를 얻을 수 있습니다. (3) $connection은 uid
를 바인드합니다. $worker->connections 얻은 것은 현재 모든 사용자의 연결이고 연결은 링크 중 하나입니다. 웹소켓 연결 시간 기록:rrreee
웹소켓 연결 시간 가져오기:rrreee데이터를 $connection 연결 속성에 바인딩할 수 있음을 알 수 있습니다. 예: rrreeeJavaScript 측이 websocket 서버 성공 후 즉시 바인딩을 위해 서버에 uid를 보냅니다. rrreee (4) 유니캐스트 메시지, 즉 사용자 지정 보내기 rrreee
이 시점에서 workman 기반 사용자 지정 개체 메시지가 완성되었습니다. 🎜🎜php 파일은 작곡가에 저장되어 있으므로 파일을 복사해서application/command
에 넣고 네임스페이스를 수정한 후 자신의 프로젝트에 저장하기만 하면 됩니다🎜🎜🎜 (5) 비교 swoole🎜🎜🎜1. Workman은 Windows 시스템에서 실행할 수 있지만 swoole은 실행할 수 없습니다. 🎜🎜2. workman: $worker->connections는 모든 연결을 가져오고, $connection->id는 자체 연결 ID를 가져옵니다. $server->connections는 모든 연결을 가져오고, $connection->fd는 자체 연결을 가져옵니다. ID. 🎜🎜3. workman이 시작될 때 onWorkerStart 메서드가 실행되며 swoole은 WorkerStart를 사용하여 타이머를 시작할 수 있습니다. 🎜🎜대화방이나 타이머는 여전히 워크맨이 더 편리해요. 🎜🎜🎜ThinkPHP 관련 기술 기사를 더 보려면 🎜🎜🎜ThinkPHP 사용 튜토리얼🎜🎜🎜 칼럼을 방문하여 알아보세요! 🎜🎜위 내용은 Workman을 사용하여 채팅방 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

如何使用MySQL和Java实现一个简单的聊天室功能引言:在当今社交媒体的盛行下,人们越来越依赖于在线聊天来交流和分享信息。如何使用MySQL和Java实现一个简单的聊天室功能是一个非常有趣和实用的项目。本文将介绍如何使用MySQL和Java来实现这一功能,并提供具体的代码示例。一、搭建数据库首先,我们需要在MySQL中创建一个数据库来存储聊天室的相关信息。

如何使用Go语言开发Websocket聊天室Websocket是一种实时通信协议,通过建立一次连接,可以在服务器和客户端之间进行双向通信。在开发聊天室时,Websocket是一个非常好的选择,因为它可以实现实时消息交流,并且能够提供高效的性能。本文将介绍如何使用Go语言开发一个简单的Websocket聊天室,并提供一些具体的代码示例。一、准备工作1.安装Go

基于JavaScript构建实时聊天室随着互联网的快速发展,人们越来越注重即时通讯和实时互动体验。而实时聊天室作为一种常见的即时通讯工具,对于个人和企业来说都非常重要。本文将介绍如何使用JavaScript构建一个简单的实时聊天室,并提供相应的代码示例。我们首先需要一个前端页面作为聊天室的UI界面。以下是一个简单的HTML结构示例:<!DOCTYPE

TP6Think-SwooleRPC服务的性能优化与调试一、引言随着互联网的迅猛发展,分布式计算已经成为了现代软件开发中不可或缺的一部分。在分布式计算中,RPC(RemoteProcedureCall,远程过程调用)是一种常用的通信机制,通过它可以实现跨网络的方法调用。Think-Swoole作为一个高性能的PHP框架,可以很好地支持RPC服务。但是

ThinkPHP6聊天室开发指南:实现实时通讯功能引言:随着互联网的快速发展,实时通讯的需求也越来越大。聊天室作为一种常见的实时通讯方式,受到了广泛的关注和使用。本文将通过使用ThinkPHP6框架,为大家提供一种简单、快速实现实时通讯功能的方法。一、环境配置:在开始之前,我们需要配置好开发环境。确保你已经安装了PHP和ThinkPHP6框架。同时,本文将使

利用PHP和Websocket开发聊天室功能引言:随着互联网的迅猛发展,聊天室已经成为人们日常交流和社交的重要手段之一。利用PHP和Websocket技术开发一个聊天室功能可以实现实时的双向通信,为用户提供更流畅便捷的聊天体验。本文将介绍如何使用PHP和Websocket来实现一个简单的聊天室,并提供具体的代码示例。一、准备工作:在开始开发之前,我们需要确保

在互联网时代,聊天室成为了人们交流、社交的一个重要场所。而WebSocket技术的出现,则使得实时通信变得更为流畅、稳定。今天,我们介绍如何利用Swoole框架快速搭建一个基于WebSocket的聊天室。Swoole是一款高性能的PHP协程网络通信框架,采用C语言编写,集异步IO、协程、网络通信等功能于一身,使得PHP代码能够像Node.js

现在,随着互联网的普及,实时通讯已经成为了人们日常生活中不可或缺的一部分,而聊天室作为一种集体交流的方式,也越来越被大家所接受和使用。本文将介绍如何使用PHP实现一个简单的聊天室功能。确定需求在开始编写程序之前,我们需要先明确自己的需求。一个简单的聊天室需要具备以下的基本功能:用户可以注册、登录和退出;用户可以查看历史聊天记录;用户可以发送消息,并在页面上即


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Dreamweaver Mac版
시각적 웹 개발 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전
