tsingsun / yii2-swoole

make yii2 project runing on swoole
BSD 3-Clause "New" or "Revised" License
162 stars 23 forks source link
coroutine swoole yii2

关于 Yii2 Swoole

Latest Stable Version Build Status Total Downloads

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

基于Swoole4版本后,协程的切换更方便了,也使代码中不需要再使用call_user_func替换.yii2-swoole的适应能力越来越强了.

主版本

安装

swoole4请直接使用

    composer require tsingsun/yii2-swoole

如果您使用的是swoole2版本请使用1.0版本

特点

使用方法

require(DIR . '/../../vendor/autoload.php'); $config = [ 'class'=>'tsingsun\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', // 4.0 新增选项 'enable_coroutine' => COROUTINE_ENV ], ];

Server::run($config,function (Server $server){ $starter = new \tsingsun\swoole\bootstrap\WebApp($server); //初始化函数独立,为了在启动时,不会加载Yii相关的文件,在库更新时采用reload平滑启动服务器 $starter->init = function (\tsingsun\swoole\bootstrap\BaseBootstrap $bootstrap) { //需要使用Yii-Swoole项目的Yii文件, require(DIR . '/vendor/tsingsun/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控制命令  
Usage: php [startScript] [command]

```php
//启动
php http_server.php start
//平滑重启,kill方式,需要root权限, 
php http_server.php reload
//关闭
php http_server.php stop

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

配合Nginx

Swoole没有像 传统的中间件与Nginx的紧密,部分参数需要自己往HTTP Header写..在传统$_SERVER中的命名方式保留,防止与Header出现命名冲突.

server {
    root /data/wwwroot/;
    server_name local.swoole.com;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header SERVER_NAME $server_name;
        if (!-e $request_filename) {
             proxy_pass http://127.0.0.1:9501;
        }
    }
}

受限

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

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

改写的组件

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

composer问题

Composer的中国镜像存在问题,如果版本获取有问题时,可以用https://packagist.laravel-china.org 然后指定composer.json

    "repositories": [
        {
            "type": "composer",
            "url": "https://asset-packagist.org"
        }
    ],

联系我

QQ: 21997272 Q群: 785966704 如果你觉得对您有帮助,可以请我喝咖啡鼓励下我^_^ 支付宝