企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
1 控制器默认是长生命周期的(关闭控制器复用除外),同样的控制器的`$data`数组属性也是长周期的,会发生内存泄漏 ``` ~~~ // 数组属性 public $data = []; public function test2(Request $request) { $this->data[] = time(); //发生内存泄漏 , 长生命周期的数组数据不要无限扩张 // 控制器默认是长生命周期的(关闭控制器复用除外),同样的控制器的$data数组属性也是长周期的 return response(json_encode($this->data)); } public function test3(Request $request) { return response('hello webman'); } ~~~ ``` 请求第二次 ![](https://img.kancloud.cn/b4/06/b406ba7f9b43c79fd4592ce91480b6cd_480x292.png) 请求第3次 ![](https://img.kancloud.cn/57/ea/57ea26bfd5ecec135f38e1e7373515ff_465x338.png) ## [控制器生命周期](https://www.workerman.net/doc/webman/others/lifecycle.html#%E6%8E%A7%E5%88%B6%E5%99%A8%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F) * 每个控制器每个进程只会实例化一次,多个进程实例化多次(关闭控制器复用除外,参见[控制器生命周期](https://www.workerman.net/doc/webman/controller.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F)) * 控制器实例会被当前进程内多个请求共享(关闭控制器复用除外) * 控制器生命周期在进程退出后结束(关闭控制器复用除外) ## [控制器不复用与复用区别](https://www.workerman.net/doc/webman/controller.html#%E6%8E%A7%E5%88%B6%E5%99%A8%E4%B8%8D%E5%A4%8D%E7%94%A8%E4%B8%8E%E5%A4%8D%E7%94%A8%E5%8C%BA%E5%88%AB) 区别如下 #### 不复用控制器 每个请求都会重新new一个新的控制器实例,请求结束后释放该实例,并回收内存。不复用控制器和传统框架一样,符合大部分开发者习惯。由于控制器反复的创建销毁,所以性能会比复用控制器略差(helloworld压测性能差10%左右,带业务可以基本忽略) #### 复用控制器 复用的话一个进程只new一次控制器,请求结束后不释放这个控制器实例,当前进程的后续请求会复用这个实例。复用控制器性能更好,但是不符合大部分开发者习惯。 #### 以下情况不能使用控制器复用 当请求会改变控制器的属性时,不能开启控制器复用,因为这些属性的更改会影响后续请求。 有些开发者喜欢在控制器构造函数`__construct()`里针对每个请求做一些初始化,这时候就不能复用控制器,因为当前进程构造函数只会调用一次,并不是每个请求都会调用。