在这些引擎上使用传统只考虑单请求的容器技术, 就容易发生单例相互污染, 内存泄露等问题 (姑且称之为”IoC容器的请求隔离问题” ). 于是出现了各种策略以解决之....简单来说, 容器通过反射机制可获取目标方法的依赖 ( laravel 用反射来获取 typehint 类型约束, 而 Swoft项目似乎与spring 相似, 是从注释上获取的)....如果某个服务调用 在自己内未注册, 就会到父容器里查找. 父容器也是递归容器的话, 就会递归式查找.
这样, 进程级共享的单例, 就可以注册到 “进程级容器” ....双容器策略在 CommuneChatbot 项目中的效果
CommuneChatbot 目前使用双容器, Demo 在微信公众号 CommuneChatbot 上运行...., 还带来了额外的性能提升:
由于大量使用 PHP 的反射特性来实现复杂的依赖注入, 所以反射本应该是性能开销的大头.