nobody/yii2-swoole

此包最新版本(v1.2.3)没有可用的许可证信息。

在swoole协程模式下运行yii2

安装: 5

依赖者: 0

建议者: 0

安全: 0

星级: 0

关注者: 2

分支: 0

类型:yii2-extension

v1.2.3 2018-07-20 03:42 UTC

This package is not auto-updated.

Last update: 2024-09-30 01:18:08 UTC


README

Latest Stable Version Build Status Total Downloads

本项目基于php-swoole扩展的协程版本,是使yii2项目能够在swoole上运行的一个方案。
通过本项目扩展,可以极大地提高原项目的并发性。此外,还可以通过Yii2的全栈框架开发TCP、UDP、WebSocket等网络服务。

改动

  改动了websocket 让其同时支持http请求
  增加tcp服务,逻辑目前跟websocket相同

安装

    composer require nobody/yii2-swoole

特点

  • 高度兼容Yii2项目,无需修改项目代码。
  • 一行代码即可切换协程和非协程环境的支持
  • 编写启动脚本,即可享受swoole + 协程带来的高性能并发服务。
  • 运行内存表现稳定。
  • 本地化mysql、redis连接池(在协程环境下,非协程链接池意义不大)。
  • 实现了在swoole下的session功能。

如果您想简单地实现swoole,可以直接采用非协程环境。在协程环境下可能还需要做call_user_func函数的替换。

使用方法

  • swoole启动文件
    启动文件为服务启动脚本,根据不同的服务类型定制,也可以根据业务定制,具体请查看运行方式中的各服务器说明。
    协程与非协程的切换也在启动脚本中。
use \nobody\swoole\server\Server;
//站点根目录,相当于nginx的root配置
defined('WEBROOT') or define('WEBROOT', __DIR__);
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
//协程与非协程的切换
defined('COROUTINE_ENV') or define('COROUTINE_ENV', true);

require(__DIR__ . '/../../vendor/autoload.php');
$config = [
    'class'=>'nobody\swoole\server\HttpServer',
    //Swoole的配置,根据实际情况配置
    'setting' => [
        'daemonize'=>0,
        'max_coro_num'=>3000,
        'reactor_num'=>1,
        'worker_num'=>1,
        'task_worker_num'=>1,
        'pid_file' => __DIR__ . '/../runtime/testHttp.pid',
        'log_file' => __DIR__.'/../runtime/logs/swoole.log',
        'debug_mode'=> 1,
        'user'=>'tsingsun',
        'group'=>'staff',
    ],
];

Server::run($config,function (Server $server){
    $starter = new \nobody\swoole\bootstrap\WebApp($server);
    //初始化函数独立,为了在启动时,不会加载Yii相关的文件,在库更新时采用reload平滑启动服务器
    $starter->init = function (\nobody\swoole\bootstrap\BaseBootstrap $bootstrap) {
        //需要使用Yii-Swoole项目的Yii文件,
        require(__DIR__ . '/vendor/yii2-swoole/src/Yii.php');
        //原项目的配置文件引入
        $config = yii\helpers\ArrayHelper::merge(
            require(__DIR__ . '/../config/main.php'),
            require(__DIR__ . '/../config/main-local.php')
        );        
        $bootstrap->appConfig = $config;
    };
    $server->bootstrap = $starter;
    $server->start();
});
  • cli控制命令
    用法:php [startScript] [command]
//启动
php http_server.php start
//平滑重启,kill方式,需要root权限, 
php http_server.php reload
//关闭
php http_server.php stop
  • 运行方式

    • HttpServer:将swoole作为http服务器运行。
    • WebSocketServer:实现可以通过controller方式进行websocket服务编写
    • TCP/UDP Server --待完成
  • 开发调试

    • 仍然可以使用基于集成环境如XAMPP等进行调试
    • 基于swoole,只需要配置PHP环境,可用XDEBUG,如果是PHPSTORM,在Debug配置swoole运行脚本,点击Debug运行即可。
    • 在OnWorkStart断点时,请求会被阻塞
    • 启用task时,如果断点在task中,则调试请求会被阻塞
    • 如果出现页面信息输出至控制台,一般是被直接echo了,可跟踪各输出出口。

由于swoole2.0与xdebug产生冲突(主要是一些协程的客户端类上),导致无法在IDE中调试,较好的实践应该是在普通PHP环境下开发好,在swoole环境再测试

限制

原Yii2的部分功能在swoole环境具有一定限制。具体请查阅限制说明文档

请仔细理解swoole的编程需知,请求无响应大部分来源于此。
对于第三方包的call_user_func或call_user_func_array的处理请参考functionReplace.php的处理

改写的组件

为了适应swoole的内存常驻机制,对Yii的一部分组件进行了改写,尽量保持用户不产生额外的代码修改,无感迁移。
一些组件的改写说明请参阅组件改写说明

以下是原作者,感谢,我是在大神的基础上进行了改进

联系我

QQ: 21997272
如果您觉得对您有帮助,欢迎红包鼓励^_^ 支付宝