当前位置: 首页 > news >正文

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' => \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; 之前添加:

// 合并 Swoole 配置

$swooleConfig = require __DIR__ . '/swoole.php';

$config = \yii\helpers\ArrayHelper::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' => \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 连接池

composer require yiisoft/yii2-redis

在 config/swoole.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',

],

异步队列

composer require yiisoft/yii2-queue

配置:

'bootstrap' => [

// ...

'queue',

],

'components' => [

'queue' => [

'class' => \Dacheng\Yii2\Swoole\Queue\CoroutineRedisQueue::class,

'redis' => 'redis',

'channel' => 'queue',

'concurrency' => 10,

],

],

创建任务 jobs/EmailJob.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();

}

}

使用:

Yii::$app->queue->push(new EmailJob([

'to' => 'user@example.com',

'subject' => '测试',

]));

协程 HTTP 客户端

配置:

'httpClient' => [

'class' => \Dacheng\Yii2\Swoole\HttpClient\CoroutineClient::class,

'transport' => [

'class' => \Dacheng\Yii2\Swoole\HttpClient\CoroutineTransport::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' => \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

连接超时?

增加 poolMaxActive 和 poolWaitTimeout 参数

静态文件 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

http://www.jsqmd.com/news/120501/

相关文章:

  • 视觉SLAM十四讲(v2)-(4.4.2)例子:详细解释评估轨迹的误差公式
  • 【CVPR2021冠军方案深度解析】基于骨架感知的多模态手语识别系统:从零到一的完整实现指南
  • 儿童近视怎么办?科学防控攻略全解析
  • 2025年儿童羽绒服十大名牌测评:守护成长的温暖之选 - 品牌测评鉴赏家
  • 婴童羽绒服怎么选不踩坑?这5个口碑品牌帮你搞定冬日保暖难题 - 品牌测评鉴赏家
  • 前端vue3框架的快速搭建
  • 青少年羽绒服选购指南:选对温暖战袍,轻松过冬不臃肿 - 品牌测评鉴赏家
  • 9151 NTN 卫星轨道与波束类型
  • 双目相机视差算法原理与算法详细描述,它为什么可以计算每个像素的深度值?
  • 2025年12月童装时尚指南:揭秘那些超好看的童装品牌 - 品牌测评鉴赏家
  • 计算机Java毕设实战-基于springboot的演唱会购票系统的设计与实现线上线下结合的数字化票务管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 青少年羽绒服怎么选?这5个口碑品牌闭眼入,学生党收藏这篇就够了 - 品牌测评鉴赏家
  • .netcore中appsetting.json中配置取项
  • 2025年12月中大童童装推荐|萌娃穿搭不踩雷,这几款闭眼入! - 品牌测评鉴赏家
  • 宝妈必收|高性价比童装品牌省钱攻略,从新生儿到16岁都有救 - 品牌测评鉴赏家
  • ASP.NET Core WebApi 集成 MCP 协议完全指南
  • 计算机Java毕设实战-基于springboot的养宠物指南服务平台系统的设计与实现基于Java SpringBoot的宠物社区互动平台的设计与【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • hive数据转存mysql - f
  • nRF9151 NTN 功能
  • Java毕设选题推荐:基于springboot的人力资源管理系统的设计与实现员工管理,部门管理,员工考勤管理,请假申请管理【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ollama本地部署大模型
  • 【毕业设计】基于springboot的演唱会购票系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 从开发一个AI美女聊天群组开始
  • 千问又震撼开源!AI 绘画告别“一整张图”,进入原生图层时代
  • nRF9151 NTN 支持的卫星频段与轨道类型
  • 2025年 AI 智能体企业级落地现状报告
  • 萌娃也要时尚出圈!这些婴童童装闭眼入 - 品牌测评鉴赏家
  • 27、老虎和小猫
  • 2025年12月中国童装品牌调研:HEYLADS男生女生童装外套质量评测 - 品牌测评鉴赏家
  • 【面试题】数据库事务隔离与传播属性是什么?