news 2026/3/19 17:49:54

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/3/14 11:41:25

Kamailio转发机制

目录 一&#xff0e;Kamailio转发机制 1.有状态的请求转发 2.无状态的请求转发 3.有状态的响应转发 4.无状态的响应转发 二&#xff0e;示例 1.有状态的请求转发 2.无状态的请求转发 一&#xff0e;Kamailio转发机制 基于路由规则和SIP消息头&#xff08;可以是Request…

作者头像 李华
网站建设 2026/3/15 17:02:27

Thinkphp和Laravelpython桂平旅游管理系统vue

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravelpython桂平旅游管理系统vue 项目开发技…

作者头像 李华
网站建设 2026/3/4 4:24:27

Linux设备树基础

Linux设备树基础笔记学习整理基于野火鲁班猫教程并且添加自己学习后理解的内容然后还有ai的一些总结。如果有说的不好或者不对的地方希望大家指正&#xff01;&#xff01;&#xff01;这是设备树的简略图&#xff0c;设备树的根节点扩张了许多子节点。有关设备树&#xff0c;D…

作者头像 李华
网站建设 2026/3/12 2:14:07

基于Thinkphp和Laravel框架的竞赛管理系统vue

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万字以上 同行可拿货,招校园代理 基于Thinkphp和Laravel框架的竞赛管理系统vue 项目开发技…

作者头像 李华
网站建设 2026/3/10 1:54:35

one-hot编码

我来详细介绍一下 one-hot 编码&#xff08;独热编码&#xff09;。什么是 One-Hot 编码&#xff1f;One-Hot 编码是一种将分类变量转换为二进制向量的技术&#xff0c;其中每个类别都表示为一个二进制向量&#xff0c;只有一个元素为1&#xff08;"热"&#xff09;&…

作者头像 李华
网站建设 2026/3/4 8:14:29

Agilent安捷伦8564EC-40g频谱分析仪

射频江湖的“老炮儿”&#xff1a;安捷伦8564EC&#xff0c;为何至今仍是传奇&#xff1f;156/2558//3328在射频工程师的实验室里&#xff0c;如果看到一个笨重但依然锃亮的“大铁盒子”&#xff0c;前面板布满实体按键和旋钮&#xff0c;屏幕或许有些发黄&#xff0c;但显示的…

作者头像 李华