我为文件夹(比如)设置了一个 Apache vhost,website
它是另一个链接到当前版本(比如website_N
)的文件夹的符号链接,其中 N 是版本号(website -> website_123
)。部署新版本时,website_N+1
会创建另一个名为的文件夹,并在其内容准备就绪时website
重新创建符号链接以链接到该新文件夹 ( website -> website124
)。
此设置似乎混淆了 APC 的包含缓存。有时(并非总是如此,这很烦人)在新部署之后,应用程序中的以下符号链接开关include
和require
指令开始导致重新声明错误:
致命错误:无法在 /absolute/path/to/deployment/physical/folder/website_N/include_foobar.php 中重新声明类 Foobar
website_N
该消息中的文件夹通常是旧的构建文件夹之一,有时甚至不再存在。但有时会生成错误,显示最新发布文件夹的正确物理位置。保持不变的是第一次加载的类的“无法重新声明”错误。
我非常有信心这是一个 APC 问题,因为每次发生这种情况时,添加apc_clear_cache()
到应用程序引导程序都会解决问题。
我猜这是因为不同的版本位于同一个符号链接文件夹下,共享相同的“未解析”路径。因此,可能会为预编译的图像加载旧的包含连接,并且对其“已解析”路径执行包含依赖项的另一次尝试,因此它显示为新的包含并导致双重包含和以下重新声明错误。虽然这个理论可能没有多大意义,但我不太了解 APC 的内部结构。
有很多方法可以解决这个问题(作为部署过程的一部分清除缓存是显而易见的),但是如果有人可以向我解释该错误背后的机制,即此设置中的什么破坏了 APC 行为以及在什么时候(以及为什么物理上删除的文件夹路径有时会出现在那些错误消息中),那太好了。