Swoole 是 PHP 的高性能网络通信扩展,常用于常驻内存服务、HTTP 服务、WebSocket、TCP/UDP 服务、协程并发和异步任务。它和传统 PHP-FPM 的请求生命周期不同,写法上要特别注意全局状态和资源释放。
安装
常见方式:
1 | pecl install swoole |
启用扩展:
1 | extension=swoole.so |
检查:
1 | php --ri swoole |
如果服务器有多个 PHP 版本,要确认 pecl、php.ini 和运行项目的 PHP 是同一个版本。
HTTP 服务示例
1 |
|
运行:
1 | php server.php |
访问:
1 | curl http://127.0.0.1:9501 |
WebSocket 服务示例
1 |
|
生产环境通常由 systemd、Supervisor、Docker 或进程管理工具托管,不建议手动 SSH 启动后就不管。
和 PHP-FPM 的区别
| PHP-FPM | Swoole |
|---|---|
| 每个请求相对独立 | 常驻内存,状态会保留 |
| 改代码刷新请求即可 | 改代码需要重启服务 |
| 适合传统 Web | 适合长连接、高并发、异步任务 |
| 全局变量影响较小 | 全局状态容易污染后续请求 |
Swoole 项目里不要把请求级数据放到全局变量或静态变量里长期复用,除非你非常明确生命周期。
常见问题
| 问题 | 常见原因 | 处理方向 |
|---|---|---|
Class Swoole\\... not found |
扩展未安装或当前 PHP 未加载 | php -m、php --ini |
pecl install 失败 |
PHP dev 包、编译工具、版本不兼容 | 安装依赖并确认 PHP 版本 |
| 端口占用 | 服务未停止或重复启动 | lsof -nP -iTCP:9501 |
| 改代码不生效 | Swoole 常驻内存 | 重启服务或做热重载 |
| 内存越来越高 | 全局状态、连接对象、定时器未释放 | 记录内存指标,检查生命周期 |
| WebSocket 经过 Nginx 失败 | Upgrade 头未转发 | 检查 Nginx WebSocket 配置 |
| 数据库连接异常 | 常驻进程里连接失效 | 使用连接池或重连机制 |
部署建议
- 用 systemd、Supervisor 或容器托管。
- 配置日志路径和日志轮转。
- Nginx 作为外层反向代理。
- 暴露健康检查接口。
- 发布时优雅重启。
- 监控进程、端口、内存、连接数和错误日志。