Yii2-Swoole 快速入门

2025-12-12 0 635

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

 [        [            \'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

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 示例:

 [        [            \'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 SwooleAfter=network.target[Service]Type=simpleUser=www-dataWorkingDirectory=/var/www/my-appExecStart=/usr/bin/php /var/www/my-app/yii swoole/startRestart=on-failure[Install]WantedBy=multi-user.target

启动:

sudo systemctl daemon-reloadsudo systemctl enable yii2-appsudo 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)
  • ⚠️ 代码修改需要重启服务器

了解更多

  • 项目主页:https://github.com/dacheng-php/yii2-swoole
  • 示例代码:查看 examples/ 目录
  • Swoole 文档:https://wiki.swoole.com/zh-cn/

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 Yii2-Swoole 快速入门 https://www.zuozi.net/35746.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务