悠悠楠杉
PHP调用Workerman5.0实现一对一聊天
1. 安装 Workerman
首先,确保你的开发环境已经安装了 Composer。通过 Composer 安装 Workerman:
bash
composer require workerman/workerman
2. 创建聊天服务器
创建一个 PHP 文件 ChatServer.php
,并编写基本的服务器代码:
```php
require_once DIR . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
use Workerman\Connection\ConnectionInterface;
$httpworker = new Worker('http://0.0.0.0:2345'); // HTTP 协议的服务器端口2345
$httpworker->onMessage = function($connection, $data) {
// 简单回显消息到客户端
$connection->send('Message received: ' . $data);
};
$httpworker->onClose = function($connection) {
echo "Connection closed\n";
};
$httpworker->onConnect = function($connection) {
echo "New connection\n";
};
$http_worker->onWorkerStart = function() {
echo "Worker starting\n";
};
Workerman\Worker::runAll();
```
3. 实现一对一聊天逻辑
为了实现一对一聊天,我们需要维护一个客户端连接列表并基于用户选择进行消息转发。修改 onMessage
函数来处理用户消息并转发:
php
$users = []; // 存储所有用户连接的信息(例如 userId -> Connection)
$user_connections = []; // 存储每个用户的连接列表,以便实现消息转发功能
...
$http_worker->onMessage = function($connection, $data) {
$json = json_decode($data, true);
if (isset($json['type']) && $json['type'] == 'chat') { // 判断是否为聊天消息类型
$userId = $json['userId']; // 发送者的用户ID,需事先建立或通过认证机制获取
$receiverId = $json['receiverId']; // 接收者的用户ID,需根据实际场景设定或选择对话双方之一
$message = $json['message']; // 聊天内容
if (isset($user_connections[$userId]) && isset($user_connections[$receiverId])) { // 确认两个用户都已在线
foreach ($user_connections[$userId] as $toConnection) { // 将消息发送给指定接收者
if ($toConnection->id != $connection->id) { // 避免重复发送给发送者自己
$toConnection->send("Chat: $message"); // 直接向连接发送消息内容,模拟聊天效果
}
}
} else { // 如果某一方离线,则存储起来待后续发送或进行相应处理(如:离线消息推送)
// 这里可以添加离线消息的逻辑处理... 例如使用队列或数据库保存待发送的消息。 示例略。
}
} else { // 其他类型消息处理逻辑... 如:群聊等。 示例略。 } }; ... }