在ThinkPHP框架中进行Websocket通信,需要使用扩展包 workerman-for-thinkphp
。以下是具体步骤:
在 composer.json
文件中添加依赖:
"require": {
"wanglelecc/workerman-for-thinkphp": "^1.0"
}
执行 composer update
安装依赖包。
在 config/app.php
文件中添加以下配置:
'worker_man' => [
'websocket' => [
'host' => '0.0.0.0',
'port' => '2346',
'worker' => 4,
],
],
其中,host
和 port
分别表示 Websocket 监听的主机和端口号,worker
表示 Worker 进程数。
在控制器中添加以下代码:
use GatewayWorker\Lib\Gateway;
use Workerman\Worker;
use think\App;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use Workerman\Protocols\Websocket;
class WebsocketServer extends Command
{
protected function configure()
{
$this->setName('websocket_server')->setDescription('start websocket server');
}
protected function execute(Input $input, Output $output)
{
$app = new App();
$app->initialize();
$worker = new Worker();
$worker->count = config('app.worker_man.websocket.worker');
$worker->onWorkerStart = function ($worker) {
Gateway::$registerAddress = '127.0.0.1:1238';
};
$worker->onConnect = function ($connection) {
Gateway::sendToAll(Websocket::encode(json_encode(['type' => 'connect', 'msg' => '新用户加入'])));
};
$worker->onMessage = function ($connection, $data) {
$message = json_decode(Websocket::decode($data), true);
Gateway::sendToAll(Websocket::encode(json_encode(['type' => 'message', 'msg' => $message['msg']])));
};
$worker->onClose = function ($connection) {
Gateway::sendToAll(Websocket::encode(json_encode(['type' => 'close', 'msg' => '用户离开'])));
};
$worker->listen('websocket://' . config('app.worker_man.websocket.host') . ':' . config('app.worker_man.websocket.port'));
Worker::runAll();
}
}
其中,$worker->count
表示 Worker 进程数,Gateway::$registerAddress
表示注册中心的地址,$worker->onConnect
、$worker->onMessage
、$worker->onClose
分别表示连接、接收消息和关闭连接的回调函数。
在命令行中执行 php think websocket_server
启动 Websocket 服务。
在前端页面中使用 WebSocket
对象进行连接和通信。
需要注意的是,以上代码仅为示例,实际使用时需要根据具体需求进行修改。