Yii2-Swoole 快速入门

Yii2-Swoole 快速入门

让你的 Yii2 应用性能提升 10-100 倍!本教程将教你如何在 yii2-app-basic 中快速集成 yii2-swoole。

为什么使用 yii2-swoole?

  • ⚡ 比 PHP-FPM 快 10-100 倍
  • 🔄 数据库和 Redis 连接池自动管理
  • 🚀 协程并发处理请求
  • 💻 代码几乎不需要修改

系统要求

  • PHP >= 8.1
  • Swoole >= 6.0
  • Yii2 >= 2.0

安装 Swoole

bash 复制代码
pecl install swoole

php.ini 中添加:

ini 复制代码
extension=swoole.so

验证:

bash 复制代码
php --ri swoole

快速开始

1. 安装扩展

bash 复制代码
composer require dacheng-php/yii2-swoole

2. 创建配置文件

创建 config/swoole.php

php 复制代码
<?php

return [
    'bootstrap' => [
        [
            'class' => \Dacheng\Yii2\Swoole\Bootstrap::class,
            'componentId' => 'swooleHttpServer',
            'memoryLimit' => '2G',
        ],
    ],
    'components' => [
        'swooleHttpServer' => [
            'class' => \Dacheng\Yii2\Swoole\Server\HttpServer::class,
            'host' => '127.0.0.1',
            'port' => 9501,
            'documentRoot' => __DIR__ . '/../web',
            'settings' => [
                'max_coroutine' => 100000,
                'log_level' => SWOOLE_LOG_WARNING,
            ],
            'dispatcher' => new \Dacheng\Yii2\Swoole\Server\RequestDispatcher(
                __DIR__ . '/web.php'
            ),
        ],
    ],
];

3. 修改 Web 配置

编辑 config/web.php,在 return $config; 之前添加:

php 复制代码
// 合并 Swoole 配置
$swooleConfig = require __DIR__ . '/swoole.php';
$config = \yii\helpers\ArrayHelper::merge($swooleConfig, $config);

4. 启动服务器

bash 复制代码
php yii swoole/start

访问 http://127.0.0.1:9501 即可!

停止服务器:

bash 复制代码
php yii swoole/stop
# 或按 Ctrl+C

进阶功能

数据库连接池

config/swoole.php 中添加:

php 复制代码
'db' => [
    'class' => \Dacheng\Yii2\Swoole\Db\CoroutineDbConnection::class,
    'dsn' => 'mysql:host=127.0.0.1;dbname=your_database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8mb4',
    'poolMaxActive' => 20,
    'poolWaitTimeout' => 5.0,
],

使用方式与标准 Yii2 完全相同,连接池自动管理。

Redis 连接池

bash 复制代码
composer require yiisoft/yii2-redis

config/swoole.php 中添加:

php 复制代码
'redis' => [
    'class' => \Dacheng\Yii2\Swoole\Redis\CoroutineRedisConnection::class,
    'hostname' => '127.0.0.1',
    'port' => 6379,
    'poolMaxActive' => 20,
    'poolWaitTimeout' => 5.0,
],

'cache' => [
    'class' => \Dacheng\Yii2\Swoole\Cache\CoroutineRedisCache::class,
    'redis' => 'redis',
],

'session' => [
    'class' => \Dacheng\Yii2\Swoole\Session\CoroutineSession::class,
    'redis' => 'redis',
],

异步队列

bash 复制代码
composer require yiisoft/yii2-queue

配置:

php 复制代码
'bootstrap' => [
    // ...
    'queue',
],
'components' => [
    'queue' => [
        'class' => \Dacheng\Yii2\Swoole\Queue\CoroutineRedisQueue::class,
        'redis' => 'redis',
        'channel' => 'queue',
        'concurrency' => 10,
    ],
],

创建任务 jobs/EmailJob.php

php 复制代码
<?php
namespace app\jobs;

class EmailJob extends \yii\base\BaseObject implements \yii\queue\JobInterface
{
    public $to;
    public $subject;
    
    public function execute($queue)
    {
        // 发送邮件
        \Yii::$app->mailer->compose()
            ->setTo($this->to)
            ->setSubject($this->subject)
            ->send();
    }
}

使用:

php 复制代码
Yii::$app->queue->push(new EmailJob([
    'to' => 'user@example.com',
    'subject' => '测试',
]));

协程 HTTP 客户端

配置:

php 复制代码
'httpClient' => [
    'class' => \Dacheng\Yii2\Swoole\HttpClient\CoroutineClient::class,
    'transport' => [
        'class' => \Dacheng\Yii2\Swoole\HttpClient\CoroutineTransport::class,
    ],
],

使用:

php 复制代码
// 单个请求
$response = Yii::$app->httpClient->get('https://api.example.com/users')->send();

// 批量并发请求
$requests = [
    'users' => Yii::$app->httpClient->get('https://api.example.com/users'),
    'posts' => Yii::$app->httpClient->get('https://api.example.com/posts'),
];
$responses = Yii::$app->httpClient->batchSend($requests);

完整配置

config/swoole.php 示例:

php 复制代码
<?php

return [
    'bootstrap' => [
        [
            'class' => \Dacheng\Yii2\Swoole\Bootstrap::class,
            'componentId' => 'swooleHttpServer',
        ],
        'queue',
    ],
    'components' => [
        'swooleHttpServer' => [
            'class' => \Dacheng\Yii2\Swoole\Server\HttpServer::class,
            'host' => '127.0.0.1',
            'port' => 9501,
            'documentRoot' => __DIR__ . '/../web',
            'dispatcher' => new \Dacheng\Yii2\Swoole\Server\RequestDispatcher(__DIR__ . '/web.php'),
        ],
        'db' => [
            'class' => \Dacheng\Yii2\Swoole\Db\CoroutineDbConnection::class,
            'dsn' => 'mysql:host=127.0.0.1;dbname=myapp',
            'username' => 'root',
            'password' => '',
            'poolMaxActive' => 20,
        ],
        'redis' => [
            'class' => \Dacheng\Yii2\Swoole\Redis\CoroutineRedisConnection::class,
            'hostname' => '127.0.0.1',
            'poolMaxActive' => 20,
        ],
        'cache' => [
            'class' => \Dacheng\Yii2\Swoole\Cache\CoroutineRedisCache::class,
            'redis' => 'redis',
        ],
        'session' => [
            'class' => \Dacheng\Yii2\Swoole\Session\CoroutineSession::class,
            'redis' => 'redis',
        ],
        'queue' => [
            'class' => \Dacheng\Yii2\Swoole\Queue\CoroutineRedisQueue::class,
            'redis' => 'redis',
        ],
    ],
];

常见问题

代码修改后不生效?

重启服务器:Ctrl+C 停止后重新启动(Swoole 常驻内存)

无法启动?

  • 检查 Swoole 是否安装:php --ri swoole
  • 检查端口占用:lsof -i:9501

连接超时?

增加 poolMaxActivepoolWaitTimeout 参数

静态文件 404?

确认 documentRoot 指向正确的 web 目录

生产部署

Systemd 服务

创建 /etc/systemd/system/yii2-app.service

ini 复制代码
[Unit]
Description=Yii2 Swoole
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/my-app
ExecStart=/usr/bin/php /var/www/my-app/yii swoole/start
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable yii2-app
sudo systemctl start yii2-app

Nginx 反向代理

nginx 复制代码
server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://127.0.0.1:9501;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

注意事项

  • ⚠️ 避免使用全局变量(多请求共享)
  • ⚠️ 使用协程安全组件(CoroutineSession、CoroutineUser)
  • ⚠️ 代码修改需要重启服务器

了解更多

如果本项目对你有帮助,欢迎 ⭐ Star!

相关推荐
00后程序员张11 天前
Swoole HTTPS 实战,在生产环境部署、性能权衡与排查流程
后端·ios·小程序·https·uni-app·iphone·swoole
myloe0012 天前
Linux系统下如何彻底卸载软件五种方法详解
swoole
欧的曼3 个月前
cygwin+php教程(swoole扩展+redis扩展)
开发语言·redis·后端·mysql·nginx·php·swoole
iFulling3 个月前
【PHP】Swoole:CentOS安装Composer+Hyperf
centos·php·swoole
007php0073 个月前
使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
java·开发语言·redis·python·nginx·php·swoole
一个临漂的实习生4 个月前
php协程
php·swoole
hanzhuhuaa7 个月前
win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目2
后端·laravel·swoole
森叶7 个月前
linux如何与windows进行共享文件夹开发,不用来回用git进行拉来拉去,这个对于swoole开发者来说特别重要
linux·git·swoole
Ai 编码助手7 个月前
基于 Swoole 的高性能 RPC 解决方案
后端·rpc·swoole