php - mod_php APC 被符号链接(symbolic link)混淆,包含相同的文件两次 - 为什么?

标签 php caching symlink apc

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

这个设置似乎混淆了 APC 的包含缓存。有时(不总是,这很烦人)在新部署之后,应用程序中的以下符号链接(symbolic link)开关 includerequire 指令开始导致重新声明错误:

Fatal error: Cannot redeclare class Foobar in /absolute/path/to/deployment/physical/folder/website_N/include_foobar.php

该消息中的

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

我非常有信心这是一个 APC 问题,因为每次发生这种情况时,将 apc_clear_cache() 添加到应用程序 Bootstrap 即可解决问题。

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

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

最佳答案

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

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

关于php - mod_php APC 被符号链接(symbolic link)混淆,包含相同的文件两次 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957086/

相关文章:

java - 我想从 ListView 中选择用户名文本字段并使用该用户名删除 mysql 数据库中存在的数据

php xsl 扩展缺少 magento 就绪检查

php - codeigniter 中 undefined variable 查询

使用 ExoPlayer 的 Android MediaPlayer 持久缓存

php - 具有通用文件的多个站点

php - cUrl 将正确的内容类型发布为 json

android - 在android中设置WebView缓存的过期时间

javascript - 如何缓存图标javascript

python - 在不使用 os.chdir() 的情况下在 python 中创建相对符号链接(symbolic link)

macos - .bash_profile 和脚本作为符号链接(symbolic link)