采坑前景
Jobs 中使用的一个类中存在如下代码:
$this->source = $this->source ?? $this->getSourceModel($model, $type);
这句的本意是因为 $this->source 在多个地方存在调用, 但是调用的顺序不一样, 所以不知道有没有获取过对应 ID 的 Model
问题来了
这个类在其他地方 fpm 中也存在调用, 但因为 fpm 生命周期的原因, 一直相安无事.
...
但是, 在 Laravel 的 queue 中, 当你使用 php artisan queue:work/ php artisan horizon 运行队列处理器后, 队列处理器是一个常驻的进程并且在内存中保存着已经启动的应用状态。因此,它们并不会在启动后注意到你代码的更改。
...
队列处理器常驻内存, 所以声明过的变量, 在下一次队列执行的时候, 依然存在(跟 swoole 同理), 所以上面的代码中, 第一次 getSourceModel 后 $this->source 就总是为 true