发布后某些请求报Class Vendor\Module\Model\ThingFactory does not exist,刷新或切节点又恢复。生产模式不应依赖运行时临时生成类。

按顺序解决

  1. 从报错节点检查源码中的Thing类是否存在、命名空间和大小写正确,再检查generated/code对应Factory。只有部分节点缺失时直接比较release版本。
  2. 确认部署顺序:安装依赖与代码完成后运行setup:di:compile,随后再打包并原子切换release。若compile后才复制app/code,新类不会被生成。
  3. generated/code必须和本次源码、composer.lock一起发布;不要多个节点共享一个正在写入的generated目录。Web进程需要读取权限,但不应靠开放777解决。
  4. 清PHP OPcache或滚动重启FPM,使旧进程不再引用上一release路径。多节点逐台健康检查后再接流量。

检查命令

test -f app/code/Vendor/Module/Model/Thing.php
test -f generated/code/Vendor/Module/Model/ThingFactory.php
bin/magento setup:di:compile
find generated/code/Vendor/Module/Model -maxdepth 1 -type f -ls
sha256sum composer.lock app/etc/config.php

验证结果

连续请求覆盖所有Web节点,目标类始终存在;重新发布一次也不复发,且部署期间没有节点读取半成品目录。

注意:在Cloud或只读文件系统中更不能依赖运行时生成,构建产物缺失必须回滚release。