news 2026/7/26 8:26:12

Yii2-Swoole 快速入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 23:37:43

基于SpringBoot的美食评价系统的设计与实现源码+文档

基于 SpringBoot 框架开发的美食评价系统&#xff0c;是面向美食爱好者、餐饮商家及平台管理员的一体化信息交互平台&#xff0c;核心解决美食评价信息分散、商家与用户沟通低效、数据统计分析困难等问题。该系统采用前后端分离架构&#xff0c;后端以 SpringBoot 为核心&#…

作者头像 李华
网站建设 2026/7/25 17:10:54

视觉SLAM十四讲(v2)-(4.4.2)例子:详细解释评估轨迹的误差公式

视觉SLAM十四讲(v2)-(4.4.2)例子:详细解释评估轨迹的误差公式在视觉SLAM等实际工程中&#xff0c;评估算法估计轨迹与真实轨迹的差异至关重要&#xff0c;以下将详细解释绝对轨迹误差&#xff08;ATE&#xff09;和相对位姿误差&#xff08;RPE&#xff09;这两种评估轨迹误差的…

作者头像 李华
网站建设 2026/7/24 23:37:22

医疗问答漏关键文献后来补RAG检索才稳住准确率

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 目录医疗数据科学&#xff1a;当“看病”遇上“算命”&#xff1f; 一、从“看病”到“算病”&#xff1a;数据科学的逆袭 二、真实小错误&#xff1a;我的“2023年诺贝尔奖”提名 三、冷笑话时间 四、数据存储的“薛定谔…

作者头像 李华
网站建设 2026/7/26 7:12:11

Java毕设项目:基于springboot的校园智能物流管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/25 23:25:44

Java毕设项目推荐-基于SpringBoot+Vue的智能驿站系统设计与实现基于springboot的校园智能物流管理系统的设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/25 3:20:42

报表服务器无法验证数据库中加密数据的完整性

U9C服务器突然一下所有的查询功能都不正常运行。没有想多&#xff0c;大概率又是SQL REPORT SERVICE出问题了吧。果然&#xff0c;运行一下【Web 用户 Url】,报错了&#xff01;官网上有不少案例存在了&#xff0c;逐一试过也是无效。最后只能是删除SQL的报表服务&#xff0c;重…

作者头像 李华