5

我们最近在我们的服务器上启用了APC,有时当我们发布新代码或更改时,我们会发现被更改的源文件开始抛出未反映在代码中的错误,通常会解析描述不存在的令牌的错误存在。我们已经通过运行php -l错误日志说受到影响的文件来验证这一点。通常重新发布可以解决问题。我们使用的是 PHP 5.2.0 和 APC 3.01.9。我的问题是,有没有其他人遇到过这个问题,或者有没有人认识到我们的问题是什么?如果是这样,您是如何修复它的,或者我们如何修复它?

编辑:我可能应该添加一些关于我们发布过程的细节。内容通过 rsync 从登台服务器推送到生产服务器。我们启用apc.stat_ctime是因为它说这有助于使用 rsync 使事情运行得更顺畅。 apc.write_lock默认情况下是打开的,我们还没有禁用它。同上apc.file_update_protection

4

6 回答 6

7

听起来像一个部分发布的文件被读取并缓存为损坏。apc.file_update_protection旨在帮助阻止这种情况。

在 php.ini 中:apc.file_update_protection integer

apc.file_update_protection设置延迟缓存全新文件。默认值为 2 秒,这意味着如果文件上的修改时间戳 (mtime) 显示它在被访问时小于 2 秒,则不会缓存该文件。访问这个写了一半的文件的不幸的人仍然会看到怪异,但至少不会持续存在。

在编辑问题之后:我没有看到这类问题的一个原因是我推送了一个全新的站点副本(使用 SVN 导出)。只有在完全完成之后,它才会对 Apache/Mod_php 可见(请参阅我的回答如何开始从 subversion 存储库部署 PHP 应用程序?

当然,可能发生的另一件事是,如果您正在就地更新,您可能正在更新依赖于尚未上传的其他文件的文件。Rsync 只能保证单个文件的原子更新,而不是正在更改/上传的整个集合。另一个原因是我想把网站批量上传,然后才投入使用。

于 2009-05-04T15:26:43.200 回答
4

听起来 APC 没有执行或获取正确的文件统计信息。您可以检查它以确保 APC 配置apc.stat设置正确。您可以做的另一件事是在发布新代码时强制使用apc_clear_cache()清除缓存。

于 2009-05-04T15:20:08.643 回答
0

以前从未见过,即使我是 APC 的忠实用户。每次在服务器上发送新代码时,也许尝试触发一个清空 APC 操作码的脚本?

于 2009-05-04T14:47:46.350 回答
0

当你得到一个有解析错误的文件时,备份它,然后重新发布。获取现在可以工作的同一个文件,并对出现解析错误的文件进行比较。

于 2009-05-04T14:57:11.227 回答
0

ctime 表示创建时间。每次进行更新时,您都需要手动刷新整个缓存。

通过将 apc.php 脚本放在服务器上的某个位置,您可以轻松地做到这一点。此脚本为您提供缓存统计信息,并允许您完全删除缓存。

该脚本随 APC 一起提供。

希望他的帮助,埃弗特

于 2009-05-04T16:44:41.420 回答
0

这可能是因为您的代码与代码的缓存版本不匹配。

例如,APC 有一个 User.php 的缓存版本,但您对 User.php 或 User 使用的数据进行了更改。即使在部署之后缓存版本仍在运行,因为它还没有过期。

如果您在部署时清除 APC 缓存条目,此问题应该会消失。

于 2009-05-26T14:56:28.010 回答