webman开发中控制器复用的问题

workers

问题描述

文档中说,关闭控制器复用的前提下,跟传统php开发一致,请求结束后控制器的实例会销毁、相关内存会释放。

那么问题来了,在关闭控制器复用的前提下,控制器请求的其他类(静态调用:如模型类Table::function或其他静态调用方法,new的其他类如composer的类或第三方extend或service类),这些实例和相关内存是否会被释放?

1323 3 3
3个回答

liziyu

这个我也是一知半解的,标记一下。

  • 暂无评论
Le

new 的对象也会释放,但是静态变量会保留

  • 暂无评论
walkor

workerman不会改变php的gc规则,写业务一般都是使用临时变量,临时变量都会自动回收的,这个与控制器是否复用没有关系。

例如

function index()
{
   // 临时变量$object,index函数执行完会自动释放
   $object = new ClassOne();
   return $object->method();
}

有些类内部将类实例保存到了静态属性里留着以后复用,例如数据库类调用Db::table('xxx')->firt()时,如果数据库连接对象不存在,则会new一个并保存在类的静态数组里保证它不被释放,如果存在则复用这个数据库连接对象。这种故意不释放并不是问题,反而是一种优化,复用可以大大增加应用性能。

所以业务开发时不必特意去考虑变量释放问题,临时对象都会释放。需要复用的也没必要释放。

webman开发和传统开发体验一样,没必要纠结内存问题。另外webman自带内存检测,发现某个进程占用内存即将超过php.ini限定memory_limit值,会自动安全reload这个进程,不影响业务,对客户来说无感知。

  • workers 2023-04-10

    那调用的类的构造函数是不是只会执行一次

  • walkor 2023-04-10

    new 一次执行一次,这个是PHP特性啊,webman不会改变PHP特性

  • workers 2023-04-11

    谢谢老大

年代过于久远,无法发表回答
🔝