adminmatrix / matrix_swoole
Swoole extend for thinkphp
    1.0.0
    2025-05-14 11:08 UTC
Requires
- php: ^8.0
 - ext-json: *
 - ext-swoole: ^4.0|^5.0|^6.0
 - nette/php-generator: ^4.0
 - open-smf/connection-pool: >=1.0
 - stechstudio/backoff: ^1.2
 - swoole/ide-helper: ^5.0
 - symfony/finder: >=4.3
 - symfony/process: >=4.2
 - topthink/framework: ^6.0|^8.0
 
Requires (Dev)
- pestphp/pest: ^3.7
 - phpstan/phpstan: ^2.0
 - topthink/think-queue: ^3.0
 - topthink/think-tracing: ^1.0
 
This package is auto-updated.
Last update: 2025-10-24 01:00:06 UTC
README
安装
首先按照Swoole官网说明安装swoole扩展,然后使用
composer require topthink/think-swoole
安装swoole扩展。
使用方法
直接在命令行下启动HTTP服务端。
php think swoole
启动完成后,默认会在0.0.0.0:8080启动一个HTTP Server,可以直接访问当前的应用。
swoole的相关参数可以在config/swoole.php里面配置(具体参考配置文件内容)。
如果需要使用守护进程方式运行,建议使用supervisor来管理进程
访问静态文件
4.0开始协程风格服务端默认不支持静态文件访问,建议使用nginx来支持静态文件访问,也可使用路由输出文件内容,下面是示例,可参照修改
- 添加静态文件路由:
 
Route::get('static/:path', function (string $path) {
    $filename = public_path() . $path;
    return new \adminmatrix\swoole\response\File($filename);
})->pattern(['path' => '.*\.\w+$']);
- 访问路由 
http://localhost/static/文件路径 
队列支持
4.0开始协程风格服务端没有task进程了,使用think-queue代替
使用方法见 think-queue
以下配置代替think-queue里的最后一步:监听任务并执行,无需另外起进程执行队列
return [
    // ...
    'queue'      => [
        'enable'  => true,
        //键名是队列名称
        'workers' => [
            //下面参数是不设置时的默认配置
            'default'            => [
                'delay'      => 0,
                'sleep'      => 3,
                'tries'      => 0,
                'timeout'    => 60,
                'worker_num' => 1,
            ],
            //使用@符号后面可指定队列使用驱动
            'default@connection' => [
                //此处可不设置任何参数,使用上面的默认配置
            ],
        ],
    ],
    // ...
];
websocket
新增路由调度的方式,方便实现多个websocket服务
配置
swoole.websocket.route = true 时开启
路由定义
Route::get('path1','controller/action1');
Route::get('path2','controller/action2');
控制器
use \adminmatrix\swoole\Websocket;
use \adminmatrix\swoole\websocket\Event;
use \Swoole\WebSocket\Frame;
class Controller {
    public function action1(){//不可以在这里注入websocket对象
    
        return \adminmatrix\swoole\helper\websocket()
            ->onOpen(...)
            ->onMessage(function(Websocket $websocket, Frame $frame){ //只可在事件响应这里注入websocket对象
                ...
            })
            ->onClose(...);
    }
    
    public function action2(){
    
        return \adminmatrix\swoole\helper\websocket()
            ->onOpen(...)
            ->onMessage(function(Websocket $websocket, Frame $frame){
               ...
            })
            ->onClose(...);
    }
}
流式输出
class Controller {
    public function action(){
        return \adminmatrix\swoole\helper\iterator(value(function(){
            foreach(range(1,10) as $i)
                yield $i;
                sleep(1);//模拟等待
            }
        }));
    }
}
                