我们最近在我们的服务器上启用了APC,偶尔当我们发布新代码或更改时,我们发现更改的源文件开始抛出未反映在代码中的错误,通常会解析错误描述不存在的令牌。我们通过在错误日志中说明受影响的文件上运行php -l
来验证这一点。通常,重新发布可以解决问题。我们使用的是PHP 5.2.0和APC 3.01.9。我的问题是,有其他人遇到过这个问题,还是有人认出我们的问题是什么?如果是这样,你是如何解决它或我们如何解决它?
编辑:我应该添加一些关于我们发布过程的细节。正在通过rsync从登台服务器将内容推送到生产服务器。我们启用了apc.stat_ctime
因为它说这有助于使用rsync更顺畅。默认情况下,apc.write_lock
处于启用状态,我们尚未将其禁用。同上apc.file_update_protection
。
答案 0 :(得分:7)
听起来像部分发布的文件正在被读取并缓存为已损坏。 apc.file_update_protection旨在帮助阻止此事。
在php.ini中:apc.file_update_protection integer
apc.file_update_protection
设置 延迟缓存新品牌 文件。默认值为2秒 意味着如果修改 文件上的时间戳(mtime)显示 它不到2秒钟 被访问,它不会被缓存。 访问的不幸的人 这个半写的文件仍会看到 奇怪,但至少它不会 坚持。
在编辑问题后:我没有看到这些问题的一个原因是我推送了一个全新的网站副本(使用SVN导出)。只有在完全完成后才能看到Apache / Mod_php(参见我的回答How to get started deploying PHP applications from a subversion repository?)
当然可能发生的另一件事是,如果您正在进行更新,您可能正在更新依赖于尚未上传的其他文件。 Rsync只能保证单个文件的原子更新,而不能保证正在更改/上传的整个集合。我认为上传网站的另一个原因是,只有这样才能投入使用。
答案 1 :(得分:4)
听起来APC没有预先形成或获得正确的文件统计信息。您可以检查它以确保正确设置APC配置apc.stat。当你发布新代码时,你可以做的另一件事就是强制缓存用apc_clear_cache()清除。
答案 2 :(得分:0)
之前从未见过,即使我是APC的庞大用户。 也许每次在服务器上发送新代码时都尝试触发清空APC操作码的脚本?
答案 3 :(得分:0)
当您收到带有解析错误的文件时,请将其备份,然后重新存档。获取现在可用的相同文件,并使用解析错误对该文件执行diff。
答案 4 :(得分:0)
ctime表示创建时间。每次进行更新时,您都需要手动刷新整个缓存。
您可以通过将apc.php脚本放在服务器上的某个位置来轻松完成此操作。此脚本为您提供缓存统计信息,并允许您完全删除缓存。
该脚本随APC一起提供。
希望他的帮助, 埃弗特
答案 5 :(得分:0)
这可能是因为您的代码与代码的缓存版本之间存在不匹配。
例如,APC具有User.php的缓存版本,但您对User.php或User使用的数据进行了更改。即使在部署之后,缓存版本仍在运行,因为它尚未过期。
如果在部署时清除APC缓存条目,则此问题应该消失。