mod_php APC被符号链接困惑,包括两次相同的文件 - 为什么?

时间:2013-04-11 19:22:20

标签: php caching symlink apc

我为该文件夹设置了一个Apache vhost(比如website),这是另一个链接到具有当前版本的文件夹(例如website_N)的符号链接,其中N是版本号( website -> website_123)。部署新版本时,会创建另一个名为website_N+1的文件夹,当其内容准备就绪时website将重新创建符号链接以链接到该新文件夹(website -> website124)。

这种设置似乎混淆了APC的包含缓存。新部署后,有时(并非总是令人讨厌)以及应用程序中的以下符号链接切换includerequire指令开始导致重新声明错误:

  

致命错误:无法在/absolute/path/to/deployment/physical/folder/website_N/include_foobar.php重新声明类Foobar

该邮件中的

website_N文件夹通常是旧版本文件夹之一,有时甚至不再存在。但有时会生成错误,显示最新版本文件夹的正确物理位置。对于第一次加载的类,“无法重新声明”的错误保持不变。

我非常有信心这是一个APC问题,因为每次发生这种情况都会在应用程序引导程序中添加apc_clear_cache()来解决问题。

我想这是因为不同版本位于同一个符号链接文件夹下,共享相同的“未解析”路径。因此,可能会为预编译的图像加载旧的包含连接,并且为其“已解析”的路径执行另一次包含依赖项的尝试,因此它显示为新的并导致双重包含和重新声明错误。虽然这个理论可能没有多大意义,但我不太了解APC的内部结构。

有很多方法(清除缓存作为部署过程的一部分是显而易见的),但是如果有人可以向我解释该错误背后的机制,即此设置中的内容会破坏APC的行为以及在何时<以及为什么物理上删除文件夹路径有时会出现在那些错误消息中),这些都很棒。

1 个答案:

答案 0 :(得分:1)

我使用TYPO3并遇到同样的问题。 TYPO3缓存很多。将符号链接更改为其他源时,必须使用shell进入TYPO3安装文件夹并手动删除缓存的文件。

之后一切都很好。花了一天时间搞清楚。