[踩坑] Swoole 常驻进程中使用 mysqli 的那些坑与正确姿势
关键词:Swoole、mysqli、MySQL、errno=110、send of 5 bytes failed、连接复用、死连接 在 PHP-FPM 时代,mysqli 几乎不会暴露什么“连接管理问题”。但一旦进入 Swoole / 常驻进程 / RPC 服务,很多团队会突然遇到类似这样的错误: send of 5 bytes failed with errno=110 Connection timed out 而且往往具备以下特征: ❌ 不是高并发 ❌ 不是慢 SQL ❌ 不是攻击 ✅ 每天稳定、零散出现 ✅ 重试一次就恢复 本文结合真实生产案例,讲清楚 为什么会出现、为什么“你明明重连了还有报错”、以及如何正确处理。 一、错误现象解析典型错误日志: Links\Db::getMysql(): send of 5 bytes failed with errno=110 Connection timed out 关键信息拆解 errno=110Linux 网络错误码:ETIMEDOUT,TCP 发送超时 send of...
深度解析 CC 攻击 & Cloudflare 防护实战指南
一、什么是 CC 攻击?CC(Challenge Collapsar)攻击 是一种典型的 应用层 DDoS 攻击,主要针对 Web 服务(HTTP / HTTPS)。 与传统 DDoS 不同,CC 攻击并不是单纯靠大流量压垮带宽,而是: 利用大量“看似合法”的 HTTP 请求,消耗服务器 CPU、线程、数据库连接等资源,最终导致服务不可用。 CC 攻击的核心特征 请求是 真实 HTTP 请求 访问路径往往是: / /login /api/* 请求频率高,但不一定“爆发式” 常伴随: 随机 User-Agent 随机 Referer 多 IP(甚至 10w+) 二、为什么 CC 攻击特别难防?1️⃣ IP 数量巨大现代 CC 攻击往往使用: 僵尸网络(Botnet) 代理池 / VPN 云主机资源 👉 单纯靠 封 IP 几乎无效。 2️⃣ 请求“看起来很正常” GET / POST 都合法 返回 200 不触发传统防火墙规则 👉 很容易绕过基于规则的拦截。 3️⃣ 攻击消耗的是应用资源CC 攻击直接打到: P...
# Go Wire 依次依赖注入原理与 Demo
本文通过一个完整 Demo,系统整理 Go Wire 的“依次 / 链式依赖注入”机制:上一个 Provider 的 return 值,如何自动作为下一个 Provider 的参数。 一、什么是 Wire 的「依次依赖注入」一句话概括: Wire 会根据“返回值类型 → 参数类型”的匹配关系,自动把多个构造函数串成一条调用链,并在编译期生成代码。 它不是: 运行时容器 反射注入 黑盒魔法 而是: 构建依赖图(Dependency Graph) 排序依赖 生成明确的 Go 构造代码 二、一个最典型的依赖链假设我们有如下对象层级: App └── UserService └── UserRepo └── *sql.DB 对应的构造函数: func NewDB() *sql.DBfunc NewUserRepo(db *sql.DB) *UserRepofunc NewUserService(repo *UserRepo) *UserServicefunc NewApp(svc *UserService) *App 这...
[踩坑] 一次诡异的 Header 丢失问题:为什么 x_log_id 会导致接口报错?
背景在一次前后端联调中,前端在请求中新增了一个 Header: x_log_id: 123456 结果接口直接报错。 经过排查发现: 浏览器 Network 中 Header 是存在的 后端却 完全接收不到 Nginx 已配置 CORS: add_header Access-Control-Allow-Headers $http_access_control_request_headers always; 但问题依然存在。 最终,前端将 Header 改为: x-log-id: 123456 问题立刻解决。 这到底是为什么? 一、问题的根源不是 CORS一开始很容易误判为 CORS 问题,毕竟是「自定义 Header + 跨域」。 但实际上: OPTIONS 预检请求是通过的 浏览器也确实把 Header 发出去了 问题发生在 Nginx 到后端这一层 二、HTTP Header 命名规范1️⃣ 标准推荐的写法HTTP Header 的标准(RFC 7230 / RFC 9110)中: Header 名称由 token 构成 历史和实际约定中:...
Nginx 限流
一、Nginx 限流能做什么?Nginx 原生支持 请求限速 / 并发限速,常用于: 防刷接口 防爬虫 防止 PHP-FPM 被打满 API QPS 控制 登录 / 下单接口保护 二、Nginx 限流的两大核心模块模块作用limit_req请求频率限制(QPS)limit_conn并发连接数限制 👉 生产环境 两个一般一起用 三、最常用:按 IP 限制请求频率(QPS)1️⃣ 定义限流区(http 块)http { limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;} 参数解释 $binary_remote_addr:客户端 IP(推荐) zone=api_limit:10m:共享内存区(约 16 万 IP) rate=10r/s:每秒 10 个请求 2️⃣ 在 location 启用限流location /api/ { limit_req zone=api_limit burst=20 nodelay; pr...
【踩坑】 Swoole 启动失败:Linux IPC 资源耗尽导致 `msgget()` 报错解析
错误现象msgget() failed, Error: No space left on device[28]Swoole\Server::start(): FactoryProcess_manager_start failed 很多人在使用 Swoole 部署高并发服务时,都会遇到这样一个“看似磁盘满、实际不是磁盘”的诡异错误。本文将从 Linux IPC 是什么 开始,完整解释问题根因与解决方案。 一、问题现象服务启动时日志如下: msgget() failed, Error: No space left on device[28]create task_workers failedFactoryProcess_manager_start failed 同时可能伴随: open(xxx.log) failed. Permission denied 最终导致: PHP Fatal error: Swoole\Server::start(): failed to start server 二、这真的是「磁盘满」吗?❌ 不是磁盘满 No space left o...
【踩坑】一次“加 Header 就跨域”的完整复盘:原因、原理与 100% 可落地的解决方案
现象:前端同学在请求接口时新增了一个 Header(如 Xp-Log-Id),浏览器立刻报 CORS 跨域错误,后端 & Nginx 日志 完全没有请求记录。 这类问题非常常见,但也极容易被误判为“前端问题”或“浏览器问题”。本文从 规范原理 → 真实链路 → 可落地方案,一次性讲清楚。 一、问题背景原始请求(正常)POST /Publics/indexContent-Type: multipart/form-data 前端新增 Header 后(出问题)POST /Publics/indexContent-Type: multipart/form-dataXp-Log-Id: 1766558867456wbdfjpr 浏览器报错示例: Access to fetch at 'https://api.xxx.com/...' from origin 'https://web.xxx.com'has been blocked by CORS policy 二、核心结论(一句话) **只要客户端增加了“自定义 Head...
🚀 深入理解 HTTP/3 与 QUIC:下一代互联网传输协议全面解析
随着互联网业务规模增大、移动网络复杂性提升、用户对低延迟体验需求不断提高,传统的 HTTP/1.1 与 HTTP/2 在多种网络环境下逐渐暴露出局限性。 为解决这些瓶颈,Google 推出了 QUIC 协议,而 QUIC 也成为 HTTP/3 的底层传输方式。如今许多大型网站已经默认使用 HTTP/3(如 Google、Facebook、Cloudflare)。 本文将从底层原理、协议演进、优势对比、网络模型等方面深入讲解 HTTP/3 与 QUIC。 ⭐ 1. 背景:HTTP/1.1 → HTTP/2 → HTTP/3 的演进HTTP/1.1 的问题 队头阻塞(HOL Blocking) TCP 连接数限制(浏览器一般每域名仅允许 6 个) 无法充分利用带宽 HTTP/2 的改进(基于 TCP) HTTP/2 引入: 二进制分帧 多路复用 头部压缩(HPACK) 但依然受 TCP 限制: 一个 TCP 连接所有流都会被一个丢包阻塞(TCP-leve...
Https SSL 证书更新失败的原因及解决方案
在日常使用 HTTPS 时,SSL 证书是保障网站安全的重要组成部分。然而,当证书即将过期或已过期时,更新证书可能会遇到各种问题。最近,在更新我的域名 ikarp.top 的 SSL 证书时,遇到了一些困难,导致证书更新失败。本文将分享遇到的问题以及如何解决它。 问题描述在我尝试使用 Certbot 更新 SSL 证书时,执行命令时提示证书更新成功,但 SSL 配置未生效,浏览器仍然无法通过 HTTPS 访问网站。具体错误提示如下: Could not automatically find a matching server block for ikarp.top. Set the `server_name` directive to use the Nginx installer.````## 问题分析通过分析错误信息,发现问题的根本原因是 Nginx 配置中的 `server_name` 指令没有正确设置,导致 Certbot 无法自动找到匹配的配置块进行证书安装。具体来说,当 Certbot 运行时,它会尝试自动更新证书并为服务器配置相关的 SSL 设置。然而,若 Ng...
使用 StatsD:轻量级实时指标上报方案详解
在现代后端系统中,监控与可观测性已经成为必不可少的基础能力。我们不仅需要知道服务是否“挂掉”,还需要实时了解服务的“健康程度”,例如接口耗时、请求量、错误率、队列长度、系统资源使用等。这些指标帮助我们快速定位问题、优化性能、以及构建更智能的告警系统。 在这些场景中,一个非常常见的基础组件就是 StatsD。今天我们就来讲讲 StatsD 是什么、有什么用、以及如何使用 PHP 的 league/statsd 客户端进行指标上报。 什么是 StatsD?StatsD 最初由 Etsy 开发,是一个基于 UDP 的轻量级指标聚合服务,用来接收应用发送的实时指标。它不负责存储,也不负责可视化,而是将聚合后的数据发送给后端系统,如: Graphite Datadog Prometheus + StatsD exporter Telegraf InfluxDB StatsD 的核心特点: 轻量级:基于 UDP,无阻塞 高性能:每秒处理百万级别的上报 聚合能力:支持计数、计时、gauge 等多种指标类型 通用性强:语言无关,任何系统都可以通过 UDP 上报 StatsD 能做...





