首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
四层生命周期只是传说?还是要自己手动实现?
htt(没外链权限)p://wiki.swoole.com/wiki/page/354.html 没用过swoole_server,直接用swoole_http_server了,然后撸了以下代码 {{{ // SL类 class SL { private $swoole_http_server; private $laravel_application; function __construct($host, $port, $setting) { $this->swoole_http_server = new swoole_http_server($host, $port); $this->swoole_http_server->set($setting); } public function load() { //启动composer自动加载器 require __DIR__ . '/../bootstrap/autoload.php'; //注册workerStart回调 $this->swoole_http_server->on('WorkerStart', array($this, 'onWorkerStart')); //注册request回调 $this->swoole_http_server->on('request', array($this, 'onRequest')); } public function onWorkerStart($serv, $worker_id) { require __DIR__ . '/Compatible/Application.php'; require __DIR__ . '/Compatible/Response.php'; $this->laravel_application = require __DIR__ . '/Compatible/start.php'; } public function onRequest($request, $response) { if ($this->laravel_application->isBooted()) { ob_start(); var_dump($this->laravel_application['router']); $content = ob_get_contents(); ob_end_clean(); $response->end($content); return; } $this->laravel_application->run($request, $response); } public function start() { //$this->swoole_http_server->setGlobal(HTTP_GLOBAL_ALL); $this->swoole_http_server->start(); } } //启动代码 require __DIR__ . '/SL.php'; $setting = array( 'max_conn' => 1024, 'timeout' => 2.5, //select and epoll_wait timeout. 'poll_thread_num' => 2, //reactor thread num 'writer_num' => 2, //writer thread num 'worker_num' => 1, //worker process num 'max_request' => 2000, 'dispatch_mode' => 1, ); $serv = new SL('127.0.0.1', 9501, $setting); $serv->load(); $serv->start(); }}} 测试情况: 在一条worker进程的情况下,第一个请求过来应用正常响应,第二个请求过来laravel显示booted,在第一个请求时创建的router对象仍然残留在application容器中,证明不存在所谓的请求生命周期,在请求回调内创建的所有资源也没有被特别地回收处理,换句话说,在swoole中php只是被简单扩展成worker进程,提供资源常驻进程的“进程生命周期”,而没有更细粒度的资源管理。 那么问题来了,请求周期的资源管理(虽然不见得有这种需求)只能自己手动实现? 如果是这样,建议wiki上还是说清楚些,误导性很大啊。
发布于8年前 · 0 次浏览 · 来自
提问
l
leo
htt(没外链权限)p://wiki.swoole.com/wiki/page/354.html 没用过swoole_server,直接用swoole_http_server了,然后撸了以下代码 {{{ // SL类 class SL { private $swoole_http_server; private $laravel_application; function __construct($host, $port, $setting) { $this->swoole_http_server = new swoole_http_server($host, $port); $this->swoole_http_server->set($setting); } public function load() { //启动composer自动加载器 require __DIR__ . '/../bootstrap/autoload.php'; //注册workerStart回调 $this->swoole_http_server->on('WorkerStart', array($this, 'onWorkerStart')); //注册request回调 $this->swoole_http_server->on('request', array($this, 'onRequest')); } public function onWorkerStart($serv, $worker_id) { require __DIR__ . '/Compatible/Application.php'; require __DIR__ . '/Compatible/Response.php'; $this->laravel_application = require __DIR__ . '/Compatible/start.php'; } public function onRequest($request, $response) { if ($this->laravel_application->isBooted()) { ob_start(); var_dump($this->laravel_application['router']); $content = ob_get_contents(); ob_end_clean(); $response->end($content); return; } $this->laravel_application->run($request, $response); } public function start() { //$this->swoole_http_server->setGlobal(HTTP_GLOBAL_ALL); $this->swoole_http_server->start(); } } //启动代码 require __DIR__ . '/SL.php'; $setting = array( 'max_conn' => 1024, 'timeout' => 2.5, //select and epoll_wait timeout. 'poll_thread_num' => 2, //reactor thread num 'writer_num' => 2, //writer thread num 'worker_num' => 1, //worker process num 'max_request' => 2000, 'dispatch_mode' => 1, ); $serv = new SL('127.0.0.1', 9501, $setting); $serv->load(); $serv->start(); }}} 测试情况: 在一条worker进程的情况下,第一个请求过来应用正常响应,第二个请求过来laravel显示booted,在第一个请求时创建的router对象仍然残留在application容器中,证明不存在所谓的请求生命周期,在请求回调内创建的所有资源也没有被特别地回收处理,换句话说,在swoole中php只是被简单扩展成worker进程,提供资源常驻进程的“进程生命周期”,而没有更细粒度的资源管理。 那么问题来了,请求周期的资源管理(虽然不见得有这种需求)只能自己手动实现? 如果是这样,建议wiki上还是说清楚些,误导性很大啊。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2016-08-18
抓
抓猴
继续挖掘,补充一个更清晰的测试例子 {{{ class SL { private $swoole_http_server; private $object_A; function __construct($host, $port, $setting) { $this->swoole_http_server = new swoole_http_server($host, $port); $this->swoole
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。