# swoole-web **Repository Path**: jiangfeng2019/swoole-web ## Basic Information - **Project Name**: swoole-web - **Description**: swoole web server - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-12 - **Last Updated**: 2026-01-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Swoole Server 修复说明(中文) 本仓库对 Swoole 服务做了若干修复,目标是消除未捕获异常、避免大量短连接并保证在协程环境下正确使用客户端。 主要改动 - `/db` 路由: - 将数据库查询放入子协程执行,并通过 `Swoole\Coroutine\Channel` 将结果传回请求协程,由请求协程负责 `response->end()`。 - 为 PDO 操作添加 `try/catch`,遇到错误返回 JSON(HTTP 500)。 - `/redis` 路由与连接池: - 新增 `RedisPool.php`,实现基于 `Swoole\Coroutine\Channel` 的连接池。 - 优先使用 `Swoole\Coroutine\Redis`(如果可用),否则回退到原生 `Redis` 扩展。 - 统一连接到 `127.0.0.1`(避免 `localhost` 解析或绑定导致的 "Can't assign requested address" 错误)。 - 在服务器生命周期创建一个共享 `RedisPool`,所有请求从池中借用连接并在完成后归还,避免每次请求建立新连接导致连接数激增。 - 在连接失败或命令失败时返回 JSON 错误并设置相应状态码。 其他 - 移除 `var_dump`,统一使用 JSON 响应。 - 在可能抛出异常的地方添加了错误处理,避免未捕获异常崩溃服务器。 优化内容 1. **服务器配置优化** - 移除了重复的 `worker_num` 设置,使用 `swoole_cpu_num() * 2` 作为默认值 - 调整日志级别从 DEBUG 到 INFO,减少日志输出 - 增加 `max_request` 从 1000 到 10000,减少 worker 重启频率 2. **Redis 连接池优化** - 添加连接健康检查机制,定期验证连接可用性 - 实现最大连接数限制,防止连接耗尽 - 添加连接计数管理,优化资源使用 - 实现 `close()` 方法,支持优雅关闭连接池 3. **数据库连接池实现** - 创建 `DatabasePool` 类,实现基于 `Swoole\Coroutine\Channel` 的数据库连接池 - 支持连接健康检查和自动重建 - 替换直接创建的 PDO 连接,优化数据库连接管理 4. **路由匹配算法优化** - 添加路由缓存机制,提高路由匹配性能 - 将路由分为精确匹配和参数化匹配两类,优化匹配逻辑 - 提前编译参数化路由正则表达式,减少重复计算 5. **中间件处理改进** - 实现洋葱模型中间件机制,提高中间件灵活性 - 更新 `CorsMiddleware` 支持新的中间件机制 - 支持中间件链式调用和嵌套执行 6. **统一错误处理和日志记录** - 创建 `Logger` 类,实现统一日志管理 - 支持不同日志级别:DEBUG、INFO、WARNING、ERROR - 统一记录错误信息,便于调试和监控 7. **配置文件管理** - 创建 `config.json` 配置文件,集中管理所有配置项 - 实现 `Config` 单例类,支持配置加载和访问 - 移除硬编码配置,提高系统可配置性 8. **请求缓存机制** - 创建 `CacheMiddleware` 中间件,实现内存缓存 - 使用 Swoole Table 存储缓存数据,高性能且线程安全 - 支持缓存过期时间设置,默认缓存 10 分钟 - 只缓存 GET 请求,自动处理缓存命中和失效 验证步骤 1. 启动服务(在项目根目录): ```bash php /Users/songjiangfeng/work/swoole/server.php ``` 2. 测试 Redis 路由: ```bash curl -i http://127.0.0.1:9502/redis ```