PHP Swoole介绍

55 阅读4分钟

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_redisswoole_mysql)协同工作。

二、安装 Swoole

1. 环境要求

  • PHP 7.0+(推荐 7.4+ 或 8.0+)。
  • 操作系统:Linux(推荐 CentOS 7+、Ubuntu 16.04+)、macOS(开发环境)。
  • 编译依赖:gccmakeautoconfpcre-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 和示例,是学习的重要资源。