另一方面, 为了实现
可配置化
组件化
面向接口编程
灵活的闭包
等 feature, CommuneChatbot 严重依赖 IoC 容器. 所以识别要解决请求隔离的问题....Container 项目修改而来....中, 类似 laravel 的 serviceProvider 分两处注册.
// 在worker中注册的服务, 多个请求共享
'processProviders' => [
// 基础组件加载...CommuneChatbot 甚至在 Demo 中提供了一个 #runningSpy -a 的命令. 在公众号中随时输入它, 可以查看当前 worker 进程中几个关键对象的实例数量....就我发现, 最容易导致内存泄露的两种情况:
某个闭包在每次请求时生成一个闭包实例, 被每个容器持有
容器生成的某个服务是匿名类, 导致相互持有
简单来说, 就是定义闭包和匿名类时, 慎重考虑内存泄露的可能性就行