我的 APC 配置有问题。APC 似乎将同名文件缓存在不同的目录中,就好像它们是同一个文件一样。
目录结构如下:
src/
development/
edge/
stable/
tag-20101101/
tag-20101115/
...
代码位于 development、edge 和每个标签目录中。似乎发生的情况是,当 APC 缓存例如 src/stable/foo/bar/quux.php 时,它会对 src/development/foo/bar/quux.php 使用相同的缓存,即使它们不是同一个文件。某些文件可能使用相对路径包含,尽管我尚未确定相对包含的文件与 APC 缓存问题之间是否存在任何联系。
我的APC配置(由apc.php报告)如下:
apc.cache_by_default 1
apc.canonicalize 1
apc.coredump_unmap 0
apc.enable_cli 0
apc.enabled 1
apc.file_md5 0
apc.file_update_protection 2
apc.filters
apc.gc_ttl 3600
apc.include_once_override 0
apc.lazy_classes 0
apc.lazy_functions 0
apc.max_file_size 5M
apc.mmap_file_mask /tmp/apc.tKRzKb
apc.num_files_hint 1000
apc.preload_path
apc.report_autofilter 0
apc.rfc1867 0
apc.rfc1867_freq 0
apc.rfc1867_name APC_UPLOAD_PROGRESS
apc.rfc1867_prefix upload_
apc.rfc1867_ttl 3600
apc.shm_segments 1
apc.shm_size 128
apc.stat 1
apc.stat_ctime 0
apc.ttl 0
apc.use_request_time 1
apc.user_entries_hint 4096
apc.user_ttl 0
apc.write_lock 1
我使用的是 PHP 5.3.2 和 APC 3.1.3p1,带有 PHP-FPM。服务器是虚拟化的 RHEL 5.4,分配了 4GB RAM,在另一台 RHEL 5.4 服务器上运行,该服务器有 32 GB RAM 和 12 个 AMD Opteron 2.4 GHz CPU 核心。
有人知道是什么原因造成的吗,或者我可以做些什么来解决它?
答案1
根据文档,在无统计模式下,路径可以被规范化。
http://php.net/manual/en/apc.configuration.php
我的解释是,如果您在上述配置中将 apc.stat 更改为 0,它可能会起作用。
//约翰
答案2
事实证明,问题不是由 APC 引起的,而是因为托管代码的 NFS3 NAS 被挂载为 NFS4。这导致了文件系统缓存问题。使用 APC 在一定程度上掩盖了实际问题。
不过还是感谢您抽出时间。