我正在运行一个具有多个虚拟主机的Apache实例,它运行相同代码库的不同版本。
我的意思是,一个虚拟主机可以服务一个类的一个版本,另一个可以服务同一个类的第二个版本(相同的名称空间,同名)。
/file/path/host-a/MyClass.php
/file/path/host-b/MyClass.php
有时我会得到一个异常,告诉我其中一个虚拟主机使用类的“错误”版本。例如。在主机b上,我获得了/file/path/host-a/MyClass.php
我认为APC optcode缓存使用了文件路径,至少作为密钥的一部分,但我担心,它只使用合格的类名,如:
My\Namespace\MyClass
是这样的吗?如果可能,请指出有关此主题的任何文档。
答案 0 :(得分:1)
虽然无法找到关于此问题答案的任何文档php - APC opcode caching on different file versions解释说APC optcode缓存实际上确实使用了定义类的文件路径来区分具有相同名称的类。 / p>
在@hakra向我指出APC的行为之后,我能够专注于类加载器。我的类加载器使用memcached
作为缓存来存储类路径。事实证明,构建缓存键的代码是导致问题的原因 - 而不是它似乎的APC。
所以你应该处于类似的情况,你看到加载了一个类的错误“版本”,确保你的类加载器按预期工作。一个明显的线索当然是问题类的文件路径。