PHP Swoole 是一个基于 C 语言开发的高性能异步网络通信框架,为 PHP 提供了异步 I/O、多进程 / 协程、网络服务(HTTP/WebSocket/TCP/UDP)等核心能力,解决了传统 PHP-FPM 同步阻塞、并发能力弱的问题。
它可以广泛应用于高性能 API、微服务、即时通讯、物联网、游戏服务器等场景。
一、核心特性
1. 异步 I/O
- 支持异步 TCP/UDP 网络通信、文件读写、定时器、信号处理。
- 非阻塞模式,避免传统 PHP 同步等待 I/O(如数据库查询、网络请求)时的性能浪费。
2. 多进程 / 协程模型
- 多进程:Master 进程管理 Worker 进程,Worker 进程处理业务逻辑,支持进程间通信(IPC)。
- 协程:轻量级 “用户态线程”,由 Swoole 调度,切换开销极低(无需内核参与),支持百万级并发。
3. 内置网络服务
- 一键启动 HTTP 服务器、WebSocket 服务器、TCP 服务器、UDP 服务器,无需依赖 Nginx/Apache 反向代理(生产环境仍建议用 Nginx 做前端代理,处理静态资源、负载均衡)。
4. 高性能
- C 语言底层,性能接近 Nginx、Node.js。
- 支持 Reactor 模型(事件驱动),处理高并发连接时资源占用低。
5. 丰富的扩展能力
- 支持定时器、信号处理、进程池、内存共享、协程调度等高级功能。
- 可与 Redis、MySQL、MongoDB 等数据库通过异步客户端(如
swoole_redis、swoole_mysql)协同工作。
二、安装 Swoole
1. 环境要求
- PHP 7.0+(推荐 7.4+ 或 8.0+)。
- 操作系统:Linux(推荐 CentOS 7+、Ubuntu 16.04+)、macOS(开发环境)。
- 编译依赖:
gcc、make、autoconf、pcre-devel(Ubuntu 为libpcre3-dev)。
2. 编译安装
运行
# 1. 下载 Swoole 源码(官网:https://www.swoole.com/)
wget https://github.com/swoole/swoole-src/archive/v5.1.0.tar.gz
tar -zxvf v5.1.0.tar.gz
cd swoole-src-5.1.0
# 2. 编译配置(指定 PHP 安装路径,如 /usr/local/php/bin/phpize)
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
# 3. 编译安装
make && make install
# 4. 配置 php.ini
echo "extension=swoole.so" >> /usr/local/php/etc/php.ini
# 5. 验证安装
php -m | grep swoole # 输出 swoole 即安装成功
3. Composer 安装(推荐)
运行
composer require swoole/swoole:^5.0
三、快速入门示例
1. TCP 服务器
运行
<?php
// 创建 TCP 服务器,监听 0.0.0.0:9501
$server = new Swoole\Server('0.0.0.0', 9501);
// 监听连接进入事件
$server->on('Connect', function ($server, $fd) {
echo "客户端 {$fd} 连接成功\n";
});
// 监听数据接收事件
$server->on('Receive', function ($server, $fd, $from_id, $data) {
echo "收到客户端 {$fd} 数据:{$data}\n";
// 向客户端发送数据
$server->send($fd, "服务器已收到:{$data}");
});
// 监听连接关闭事件
$server->on('Close', function ($server, $fd) {
echo "客户端 {$fd} 断开连接\n";
});
// 启动服务器
$server->start();
运行:
运行
php tcp_server.php
测试(用 telnet 或 nc):
运行
telnet 127.0.0.1 9501
2. HTTP 服务器
运行
<?php
// 创建 HTTP 服务器,监听 0.0.0.0:9502
$http = new Swoole\Http\Server('0.0.0.0', 9502);
// 监听请求事件
$http->on('Request', function ($request, $response) {
// 设置响应头
$response->header('Content-Type', 'text/plain');
// 响应内容
$response->end("Hello Swoole! Request URI: {$request->server['request_uri']}");
});
// 启动服务器
$http->start();
运行:
运行
php http_server.php
测试(用浏览器或 curl):
运行
curl http://127.0.0.1:9502/hello
3. WebSocket 服务器(即时通讯)
运行
<?php
// 创建 WebSocket 服务器,监听 0.0.0.0:9503
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9503);
// 监听连接打开事件
$ws->on('Open', function ($ws, $request) {
echo "客户端 {$request->fd} 连接成功\n";
});
// 监听消息接收事件
$ws->on('Message', function ($ws, $frame) {
echo "收到客户端 {$frame->fd} 消息:{$frame->data}\n";
// 广播消息给所有连接的客户端
foreach ($ws->connections as $fd) {
if ($ws->isEstablished($fd)) {
$ws->push($fd, "用户 {$frame->fd} 说:{$frame->data}");
}
}
});
// 监听连接关闭事件
$ws->on('Close', function ($ws, $fd) {
echo "客户端 {$fd} 断开连接\n";
});
// 启动服务器
$ws->start();
前端测试(HTML + JavaScript):
预览
<!DOCTYPE html>
<html>
<body>
<input type="text" id="msg">
<button onclick="send()">发送</button>
<div id="log"></div>
<script>
// 连接 WebSocket 服务器
let ws = new WebSocket('ws://127.0.0.1:9503');
// 连接成功回调
ws.onopen = function() {
log('连接成功');
};
// 接收消息回调
ws.onmessage = function(e) {
log(e.data);
};
// 发送消息
function send() {
let msg = document.getElementById('msg').value;
ws.send(msg);
document.getElementById('msg').value = '';
}
// 日志输出
function log(text) {
document.getElementById('log').innerHTML += text + '<br>';
}
</script>
</body>
</html>
四、核心概念
1. 进程模型
- Master 进程:主进程,负责管理 Worker 进程、监听端口、接收连接。
- Worker 进程:工作进程,处理业务逻辑(如接收数据、处理请求),可配置多个(建议与 CPU 核心数一致)。
- Task 进程:任务进程,处理耗时操作(如数据库写入、文件处理),避免阻塞 Worker 进程。
2. 协程
- 轻量级线程,由 Swoole 调度,无需手动管理。
- 支持
go()关键字创建协程,协程内的 I/O 操作(如swoole_redis->get())会自动切换,不阻塞其他协程。
示例:
运行
<?php
// 创建协程
go(function () {
// 异步 Redis 操作(需安装 swoole_redis 扩展)
$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
$result = $redis->get('key');
echo "Redis 结果:{$result}\n";
});
// 另一个协程
go(function () {
// 异步 sleep(不阻塞其他协程)
Swoole\Coroutine::sleep(1);
echo "协程 2 执行完成\n";
});
五、生产环境注意事项
1. 配置优化
- 设置
worker_num(Worker 进程数)为 CPU 核心数的 1-2 倍。 - 启用
task_worker_num(Task 进程数)处理耗时任务。 - 配置
max_request(每个 Worker 进程处理的最大请求数),避免内存泄漏。
2. 进程守护
-
生产环境建议启用守护进程模式:
php
运行
$server->set([ 'daemonize' => true, // 守护进程模式 'log_file' => '/var/log/swoole.log', // 日志文件 ]);
3. 信号处理
-
监听
SIGTERM信号,实现优雅停机:运行
$server->on('WorkerExit', function ($server, $worker_id) { // 释放资源 }); // 捕获 SIGTERM 信号 Swoole\Process::signal(SIGTERM, function () use ($server) { $server->shutdown(); });
4. 监控与日志
- 使用
swoole_top工具监控 Swoole 进程状态。 - 配置日志文件,记录错误信息和业务日志。
5. 安全防护
- 生产环境建议用 Nginx 作为前端代理,处理 HTTPS、静态资源、负载均衡。
- 限制
max_connection(最大连接数),避免服务器过载。
总结
Swoole 是 PHP 高性能网络编程的核心框架,通过异步 I/O、多进程 / 协程模型,让 PHP 具备了处理高并发、低延迟业务的能力。适用于 API、微服务、即时通讯、物联网等场景。
学习 Swoole 需要掌握其核心概念(进程模型、协程、事件驱动),并结合实际业务场景进行实践。官方文档(wiki.swoole.com/)提供了详细的 API 和示例,是学习的重要资源。