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

pecl install swoole 

php.ini 中添加:

extension=swoole.so 

验证:

php --ri swoole 

快速开始

1. 安装扩展

composer require dacheng-php/yii2-swoole 

2. 创建配置文件

创建 config/swoole.php

<?php  return [     'bootstrap' => [         [             'class' => DachengYii2SwooleBootstrap::class,             'componentId' => 'swooleHttpServer',             'memoryLimit' => '2G',         ],     ],     'components' => [         'swooleHttpServer' => [             'class' => DachengYii2SwooleServerHttpServer::class,             'host' => '127.0.0.1',             'port' => 9501,             'documentRoot' => __DIR__ . '/../web',             'settings' => [                 'max_coroutine' => 100000,                 'log_level' => SWOOLE_LOG_WARNING,             ],             'dispatcher' => new DachengYii2SwooleServerRequestDispatcher(                 __DIR__ . '/web.php'             ),         ],     ], ]; 

3. 修改 Web 配置

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

// 合并 Swoole 配置 $swooleConfig = require __DIR__ . '/swoole.php'; $config = yiihelpersArrayHelper::merge($swooleConfig, $config); 

4. 启动服务器

php yii swoole/start 

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

停止服务器:

php yii swoole/stop # 或按 Ctrl+C 

进阶功能

数据库连接池

config/swoole.php 中添加:

'db' => [     'class' => DachengYii2SwooleDbCoroutineDbConnection::class,     'dsn' => 'mysql:host=127.0.0.1;dbname=your_database',     'username' => 'root',     'password' => '',     'charset' => 'utf8mb4',     'poolMaxActive' => 20,     'poolWaitTimeout' => 5.0, ], 

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

Redis 连接池

composer require yiisoft/yii2-redis 

config/swoole.php 中添加:

'redis' => [     'class' => DachengYii2SwooleRedisCoroutineRedisConnection::class,     'hostname' => '127.0.0.1',     'port' => 6379,     'poolMaxActive' => 20,     'poolWaitTimeout' => 5.0, ],  'cache' => [     'class' => DachengYii2SwooleCacheCoroutineRedisCache::class,     'redis' => 'redis', ],  'session' => [     'class' => DachengYii2SwooleSessionCoroutineSession::class,     'redis' => 'redis', ], 

异步队列

composer require yiisoft/yii2-queue 

配置:

'bootstrap' => [     // ...     'queue', ], 'components' => [     'queue' => [         'class' => DachengYii2SwooleQueueCoroutineRedisQueue::class,         'redis' => 'redis',         'channel' => 'queue',         'concurrency' => 10,     ], ], 

创建任务 jobs/EmailJob.php

<?php namespace appjobs;  class EmailJob extends yiibaseBaseObject implements yiiqueueJobInterface {     public $to;     public $subject;          public function execute($queue)     {         // 发送邮件         Yii::$app->mailer->compose()             ->setTo($this->to)             ->setSubject($this->subject)             ->send();     } } 

使用:

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

协程 HTTP 客户端

配置:

'httpClient' => [     'class' => DachengYii2SwooleHttpClientCoroutineClient::class,     'transport' => [         'class' => DachengYii2SwooleHttpClientCoroutineTransport::class,     ], ], 

使用:

// 单个请求 $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  return [     'bootstrap' => [         [             'class' => DachengYii2SwooleBootstrap::class,             'componentId' => 'swooleHttpServer',         ],         'queue',     ],     'components' => [         'swooleHttpServer' => [             'class' => DachengYii2SwooleServerHttpServer::class,             'host' => '127.0.0.1',             'port' => 9501,             'documentRoot' => __DIR__ . '/../web',             'dispatcher' => new DachengYii2SwooleServerRequestDispatcher(__DIR__ . '/web.php'),         ],         'db' => [             'class' => DachengYii2SwooleDbCoroutineDbConnection::class,             'dsn' => 'mysql:host=127.0.0.1;dbname=myapp',             'username' => 'root',             'password' => '',             'poolMaxActive' => 20,         ],         'redis' => [             'class' => DachengYii2SwooleRedisCoroutineRedisConnection::class,             'hostname' => '127.0.0.1',             'poolMaxActive' => 20,         ],         'cache' => [             'class' => DachengYii2SwooleCacheCoroutineRedisCache::class,             'redis' => 'redis',         ],         'session' => [             'class' => DachengYii2SwooleSessionCoroutineSession::class,             'redis' => 'redis',         ],         'queue' => [             'class' => DachengYii2SwooleQueueCoroutineRedisQueue::class,             'redis' => 'redis',         ],     ], ]; 

常见问题

代码修改后不生效?
重启服务器:Ctrl+C 停止后重新启动(Swoole 常驻内存)

无法启动?

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

连接超时?
增加 poolMaxActivepoolWaitTimeout 参数

静态文件 404?
确认 documentRoot 指向正确的 web 目录

生产部署

Systemd 服务

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

[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 

启动:

sudo systemctl daemon-reload sudo systemctl enable yii2-app sudo systemctl start yii2-app 

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!

发表评论

评论已关闭。

相关文章