请求中生成的单例, 挂载到容器的动态属性上.
持有”进程级容器”, 当绑定不存在时, 到”进程级容器” 上查找之....请求结束时进行必要清理, 防止内存泄露
解决方案的代码在 https://github.com/thirdgerb/container 创建了一个 composer 包 commune/container...方案: 每次请求结束时, 主动清洗掉已注册的单例
问题:
重新注册:
注册服务其实开销很大, 尤其是需要大量读文件的初始化(比如翻译组件)
无法区分进程共享的单例, 和请求隔离的单例....另一方面, 为了实现
可配置化
组件化
面向接口编程
灵活的闭包
等 feature, CommuneChatbot 严重依赖 IoC 容器. 所以识别要解决请求隔离的问题....就我发现, 最容易导致内存泄露的两种情况:
某个闭包在每次请求时生成一个闭包实例, 被每个容器持有
容器生成的某个服务是匿名类, 导致相互持有
简单来说, 就是定义闭包和匿名类时, 慎重考虑内存泄露的可能性就行