【问题标题】:mod_php APC confused by symlinks, includes same files twice - why?mod_php APC 被符号链接混淆,两次包含相同的文件 - 为什么?
【发布时间】:2013-04-11 19:22:20
【问题描述】:

我为文件夹(比如website)设置了一个 Apache vhost,它是另一个链接到当前版本的文件夹(比如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 行为以及在什么时候(以及为什么物理删除的文件夹路径有时会出现在这些错误消息中)那太好了。

【问题讨论】:

  • 我还没有深入研究代码(但我担心我可能很快就不得不这样做了)。我正在使用 Capifony/Capistrano,它也可以翻转符号链接。 APC Web 界面(apc.php 脚本)显示缓存脚本的绝对路径,因此它知道它们是不同的。清除缓存很有趣,我似乎必须做两次(第一次在符号链接切换之后似乎不起作用)
  • 我不再从事那个项目,但我想我记得清除缓存并不总是有帮助,这实际上可能意味着它根本不相关: (

标签: php caching symlink apc


【解决方案1】:

我使用 TYPO3 也遇到了同样的问题。 TYPO3 缓存了很多。将符号链接更改为另一个源时,需要使用 shell 进入 TYPO3 安装文件夹并手动删除缓存文件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 2013-03-21
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多