讲师中心 微信公众号
AI工具推荐 视频效率加速

Symfony 7.0 怎么创建WebSocket?实时通信

秋瑶同学_7009

秋瑶同学_7009

发布时间:2026-08-06 23:01:26

|

998人浏览过

|

来源于php中文网

原创

Symfony 7.0 无法原生支持 WebSocket,必须通过独立进程(如 Swoole 或 Ratchet)承载 WebSocket 服务,并借助 Redis 发布订阅机制与 Symfony 业务逻辑解耦通信,前端通过 Nginx 反向代理建立 WSS 连接实现实时推送。

symfony 7.0 怎么创建websocket?实时通信

要在 Symfony 7.0 中实现 WebSocket 实时通信,必须明确一点:Symfony 本身不内置 WebSocket 服务器能力,它是一个 HTTP 应用框架,无法原生维持长连接。直接在 Symfony 的 HTTP 内核中启动 WebSocket 服务会导致连接被 FPM 或 Apache/Nginx 中途切断,【连接必然断开且无法恢复】。因此,正确路径是将 WebSocket 服务与 Symfony 解耦,由独立进程承载,再通过 Redis、消息队列或 HTTP API 与 Symfony 业务逻辑协同。

第一步:选择并部署独立 WebSocket 服务

推荐使用 Swoole(PHP 8.2+)或 Ratchet(兼容性更广),二者均支持 Symfony 7.0 环境。

方法一(Swoole,高性能首选):在项目根目录创建 websocket-server.php,内容如下:

require_once 'vendor/autoload.php';
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;

$server = new Server('0.0.0.0', 9503);
$server->set(['worker_num' => 4]);

$server->on('open', function (Server $server, Request $request) {
  echo "Client {$request->fd} connected\n";
  $server->push($request->fd, json_encode(['type' => 'welcome', 'ts' => time()]));
});

$server->on('message', function (Server $server, Frame $frame) {
  $data = json_decode($frame->data, true);
  if (isset($data['action']) && $data['action'] === 'broadcast') {
    foreach ($server->connections as $fd) {
      if ($server->isEstablished($fd)) {
        $server->push($fd, json_encode(['type' => 'broadcast', 'payload' => $data['payload']]));
      }
    }
  }
});

$server->on('close', function (Server $server, int $fd) {
  echo "Client {$fd} disconnected\n";
});

$server->start();

运行命令:php websocket-server.php。确保系统已安装 Swoole 扩展(v5.0+),且端口 9503 在防火墙和宝塔/安全组中放行。

方法二(Ratchet,纯 PHP 兼容方案):执行 composer require cboden/ratchet,然后创建 bin/websocket 可执行脚本,写入启动逻辑——注意该方式需搭配 ReactPHP EventLoop,性能弱于 Swoole,但调试友好。

第二步:让 Symfony 7.0 与 WebSocket 服务互通

不能让 Symfony 直接调用 $server->push(),因为那是另一个进程的内存空间。必须引入中间层。

① 安装 Redis 驱动:composer require predis/predis,并在 config/packages/cache.yaml 中配置 Redis DSN。

② 在 WebSocket 服务中监听 Redis 频道:修改 websocket-server.php,在 $server->start() 前加入:

Symfony Linux版
Symfony Linux版

Symfony Linux版整理 Symfony CLI 5.17.1 官方下载入口和 Symfony 框架安装配置说明。

下载

$redis = new Predis\Client('tcp://127.0.0.1:6379');
$pubsub = $redis->pubSub();
$pubsub->subscribe('symfony:notify', function ($msg) use ($server) {
  $payload = json_decode($msg->getPayload(), true);
  foreach ($server->connections as $fd) {
    if ($server->isEstablished($fd)) {
      $server->push($fd, json_encode($payload));
    }
  }
});

③ 在 Symfony 控制器中发布消息:

use Predis\Client;
final class NotifyController
{
  public function __construct(private Client $redis)
  { }

  #[Route('/api/push', methods: ['POST'])]
  public function push(Request $request): Response
  {
    $data = json_decode($request->getContent(), true);
    $this->redis->publish('symfony:notify', json_encode([
      'type' => 'alert',
      'content' => $data['message'] ?? 'No message',
      'timestamp' => time()
    ]));
    return new JsonResponse(['status' => 'sent']);
  }
}

第三步:前端建立 WebSocket 连接并处理消息

在 Symfony Twig 模板中写入 JS 逻辑,不要用 ws://localhost:9503——生产环境必须用 Nginx 反向代理或 WSS。

const ws = new WebSocket('wss://your-domain.com/ws');
ws.onopen = () => { console.log('Connected to WebSocket server'); };
ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  if (data.type === 'broadcast') {
    document.getElementById('chat').innerHTML += `

${data.payload}
`;
  }
};
ws.onerror = (err) => { console.error('WS error:', err); };
ws.onclose = () => { setTimeout(() => window.location.reload(), 3000); };

Nginx 配置关键段(否则浏览器会报错“Error during WebSocket handshake”):

location /ws {
  proxy_pass http://127.0.0.1:9503;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
}

这一步做完后,前端即可收到来自 Symfony 控制器触发的实时推送消息。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

5457

2025.09.11

Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

175

2025.12.22

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

416

2026.01.19

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

895

2026.03.18

WebSocket 前端开发与实战技巧
WebSocket 前端开发与实战技巧

聚焦 WebSocket 在前端项目中的工程化实践,涵盖原生 JavaScript WebSocket 连接的封装与状态管理、Vue 3 中 WebSocket 的 Composable 封装(useWebSocket)、React 中自定义 Hook 管理连接生命周期、心跳检测(Ping/Pong 定时器)与自动断线重连的实现策略、指数退避重连算法、消息序列化协议(JSON / Protobuf / MessagePack)的选型与性

428

2026.05.25

WebSocket发送和接收数据教程合集
WebSocket发送和接收数据教程合集

本专题整合了WebSocket发送与接收数据教程合集,阅读专题下面的文章了解更多详细内容。

321

2026.05.25

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

0

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Symfony 官方文档
Symfony 官方文档

共0课时 | 0人学习

Composer手册
Composer手册

共0课时 | 0人学习

Symfony5【从0开始开发博客系统】
Symfony5【从0开始开发博客系统】

共120课时 | 15.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn