swooletw/laravel-swoole:
swoole在laravel/lumen框架的封装
github:https://github.com/swooletw/laravel-swoole?utm_source=gold_browser_extension
swoole:
PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
官网:https://www.swoole.com/
1.安装swoole扩展
2.安装swooletw/laravel-swoole composer require swooletw/laravel-swoole
3.配置
复制扩展包下的swoole_http.php和swoole_websocket.php到项目根目录的config下
在bootstrap/app.php中,添加:
$app->register(\SwooleTW\Http\LumenServiceProvider::class);
$app->configure('swoole_http');
$app->configure('swoole_websocket');
4.命令行命令
php artisan swoole:http start //开启http服务
php artisan swoole:http stop //停止
php artisan swoole:http restart //重新启动
php artisan swoole:http reload //重新加载,每次改完代码都需运行此命令
php artisan swoole:http infos //运行信息
swoole server
ab -c 100 -n 100 http://127.0.0.1:1215/
nginx with fpm
ab -c 100 -n 100 http://jmd-service.com/
1.通过lumen服务注册者注册:\SwooleTW\Http\LumenServiceProvider
2.通过ioc容器创建单一(singleton)实例:swoole.http(\SwooleTW\Http\Server\Manager::class)
3.环境检测,读取配置文件,初始化操作
4.注册swoole server事件,事件回调文档:https://wiki.swoole.com/wiki/page/41.html
1)onStart事件,记录pid(后面重启,重新加载,停止需要用到)
2)onWorkStart事件,每个work或task进程首次创建时运行,此处加载了lumen框架运行文件,沙箱环境,进程通信共享内存表等等
3) onRequest事件,每个用户发送http请求都会在这里真正处理
4) onShutdown事件 停止事件,删除记录pid的文件
....更多事件请查看文档,在laravel-swoole的http服务中只用到这几个事件
由于 swooletw/laravel-swoole的http是常驻内存的,在lumen第一次加载框架核心文件的时候Request,Rsponse等对象ioc实例就已经被创建了,所以需要每次请求的时候都要重置一下,扩展包中Sandbox就是负责处理这些的,如果有需要要重新初始化的ioc容器,只需在swoole_http中的instance加入就可以了
对static静态变量导致内存泄露解决思路
在每个请求开始的时候都有事件发送,可以监听这些事件,清理static静态变量
设置swoole_http中server.options.max_request最大请求数,到达该请求数会重启work
....待补充
如果写的问题,欢迎指出,谢谢