「技术」下的文章

2026-06-27 👤 mdo 👁 1 阅读

Task 队列阻塞与丢弃

在本地测试没问题,但线上在高并发、高频发布消息时出现“丢包”或“收不到信息”的现象,这在 think-swoole / Swoole 开发中非常典型。 虽然你配置了 task_worker_num = 8,但在高频广播消息的场景下,问题通常不是因为 Task 进程不够,而是由于 Swoole 的进程

2026-06-26 👤 mdo 👁 4 阅读

think-swoole 全局广播

在 think-swoole 中,全局广播(向当前服务器上所有连接的客户端发送消息)通常有两种实现方式。 第一种是利用 think-swoole 内置的 Websocket 门面(Facade)或事件机制,适合单机部署;第二种是结合 Redis 发布/订阅(Pub/Sub),适合分布式/多机部署。

2026-06-26 👤 mdo 👁 0 阅读

利用 Swoole 协程特性

默认配置 task_worker_num => 4 在面对批量推送消息时严重不足。当需要给成百上千个用户推送消息时,循环调用 Swoole 的 push 或投递大量小任务,会瞬间挤爆这 4 个进程,导致后续任务全部排队甚至超时。 请按照以下分级方案进行优化,方案一和方案二可以立即见效: 方案一:立即

2026-06-25 👤 mdo 👁 5 阅读

Session 文件冲突

即便你修正了拼写错误并加上了 session_start(),在 ThinkPHP 6 (TP6) 环境下,$sessionId 和 $sessionId2 依然是不一样的。 不仅如此,由于操作顺序和 TP6 的底层设计,这段代码在实际运行中还会带来非预期的并发副作用。 1. 为什么它们仍然不一样?

2026-06-24 👤 mdo 👁 3 阅读

让 TP6 的 Session 组件重新接管控制权

我们需要让 TP6 的 Session 组件重新接管控制权,同时强行将其配置到 Redis 2号库,并在入口处拦截并纠正 APP 带来的 26 位 Token,最后同步写到 6号库。 请严格按照以下步骤进行调整,无需修改你现有的 session() 读写业务代码: 第一步:恢复 TP6 的 Sess

2026-06-19 👤 mdo 👁 0 阅读

开发一个博客文章发布 App

针对 iOS 平台开发一个博客文章发布 App(支持写文章、编辑、管理和一键发布),需要兼顾极致的富文本编辑体验与高能的网络通信同步。 以下是为您量身定制的完整开发技术栈、核心架构和功能实现方案: 🎨 核心功能模块 富文本编辑器:支持 Markdown 解析、实时预览、图片/视频插入。 本地草稿箱

2026-06-19 👤 mdo 👁 1 阅读

Golang 中,结合使用 RPC(远程过程调用)与 WebSocket

在 Golang 中,结合使用 RPC(远程过程调用)与 WebSocket 是一种极佳的实时全双工通信方案。它不仅克服了传统 gRPC 对浏览器支持不佳的痛点,还能利用 WebSocket 的长连接特性消除频繁建立 HTTP 连接的开销。 [1, 2, 3] 常见的实现方案主要基于 JSON-RP

2026-06-18 👤 mdo 👁 8 阅读

通过监听 request 事件来拦截和验证 WebSocket 握手

在 think-swoole 中,如果项目同时开启了 HTTP 服务和 WebSocket 服务,客户端发起 WebSocket 握手时,底层的 Swoole 会优先将其视为一个普通的 HTTP 请求。 如果你直接监听底层的 handshake 事件感到协议计算太繁琐,完全可以通过监听 reques

2026-06-18 👤 mdo 👁 3 阅读

在原生 WebSocket 模式下,增加握手验证逻辑

在原生 WebSocket 模式下,增加握手验证逻辑有两种主流方式: 方式一:基于 HTTP 握手阶段验证(最安全,在连接建立前直接拦截)。 方式二:基于连接后首包验证(最灵活,适合小程序或部分无法自定义握手 Headers 的客户端)。 🔑 方式一:在 HTTP 握手阶段验证(推荐)

2026-06-18 👤 mdo 👁 4 阅读

前端使用的不是socket.io客户端 ,如何实现握手

如果你的前端不使用 socket.io-client,而是使用原生 WebSocket(new WebSocket())或其他普通的 WebSocket 客户端,那么你就不能在 think-swoole 的配置文件中继续使用 socketio 处理器。 因为 socketio 处理器强制要求遵循 S