文档中说,关闭控制器复用的前提下,跟传统php开发一致,请求结束后控制器的实例会销毁、相关内存会释放。
那么问题来了,在关闭控制器复用的前提下,控制器请求的其他类(静态调用:如模型类Table::function或其他静态调用方法,new的其他类如composer的类或第三方extend或service类),这些实例和相关内存是否会被释放?
这个我也是一知半解的,标记一下。
new 的对象也会释放,但是静态变量会保留
workerman不会改变php的gc规则,写业务一般都是使用临时变量,临时变量都会自动回收的,这个与控制器是否复用没有关系。
例如
function index() { // 临时变量$object,index函数执行完会自动释放 $object = new ClassOne(); return $object->method(); }
有些类内部将类实例保存到了静态属性里留着以后复用,例如数据库类调用Db::table('xxx')->firt()时,如果数据库连接对象不存在,则会new一个并保存在类的静态数组里保证它不被释放,如果存在则复用这个数据库连接对象。这种故意不释放并不是问题,反而是一种优化,复用可以大大增加应用性能。
Db::table('xxx')->firt()
所以业务开发时不必特意去考虑变量释放问题,临时对象都会释放。需要复用的也没必要释放。
webman开发和传统开发体验一样,没必要纠结内存问题。另外webman自带内存检测,发现某个进程占用内存即将超过php.ini限定memory_limit值,会自动安全reload这个进程,不影响业务,对客户来说无感知。
那调用的类的构造函数是不是只会执行一次
new 一次执行一次,这个是PHP特性啊,webman不会改变PHP特性
谢谢老大
这个我也是一知半解的,标记一下。
new 的对象也会释放,但是静态变量会保留
workerman不会改变php的gc规则,写业务一般都是使用临时变量,临时变量都会自动回收的,这个与控制器是否复用没有关系。
例如
有些类内部将类实例保存到了静态属性里留着以后复用,例如数据库类调用
Db::table('xxx')->firt()
时,如果数据库连接对象不存在,则会new一个并保存在类的静态数组里保证它不被释放,如果存在则复用这个数据库连接对象。这种故意不释放并不是问题,反而是一种优化,复用可以大大增加应用性能。所以业务开发时不必特意去考虑变量释放问题,临时对象都会释放。需要复用的也没必要释放。
webman开发和传统开发体验一样,没必要纠结内存问题。另外webman自带内存检测,发现某个进程占用内存即将超过php.ini限定memory_limit值,会自动安全reload这个进程,不影响业务,对客户来说无感知。
那调用的类的构造函数是不是只会执行一次
new 一次执行一次,这个是PHP特性啊,webman不会改变PHP特性
谢谢老大