我在Windows XP上使用PHP V5.2.11运行Symfony(1.2.9)。
我安装了APC(版本3.0.19)
我可以运行PHP脚本来证明apc正常工作(正常)。但是,当我尝试在symfony操作中使用APC调用时,我收到此错误(在apache error.log文件中):
[apc-error]无法重新声明类sfconfig
哪会立即崩溃Apache。
我尝试使用Symfony sfAPCCache包装器,然后直接调用apc_ *函数 - 结果是一样的。有谁知道为什么会这样?
答案 0 :(得分:3)
查看这些主题:
http://pecl.php.net/bugs/bug.php?id=16860
http://old.nabble.com/APC-under-WinXP-crashes-td25872662.html
答案 1 :(得分:2)
今天这个错误也发生在我身上,我开始意识到它为什么会发生(可能还有其他原因)。
APC通过完全限定名称正确识别每个类,其中包括classes名称空间。不幸的是,你最终可能会引用具有不同名称的同一个类。
例如:
我的代码中有一个错误的“use”语句,导入一个非命名空间的类,就像它在命名空间中一样。
该类,说“MyClass”在名称空间“\”中,这意味着它的正确和完全限定名称是“\ MyClass”。
在某些时候,该类被其不合格的名称“MyClass”引用,并被自动加载。在另一个文件中,我(错误地)在use语句中引用了带有名称空间前缀的类,比如“use \ SomeNamespace \ MyClass;”。因此,该类(再次)传递给我的全局__autoload()方法,但名称不同。更糟糕的是,自动加载方法足够聪明,无论如何都能找到这个类。
立即,我的脚本停止工作,所有发生的事情都是APC写的“[apc-error]无法重新声明类...”到Apache Web Server error.log中。我的网页已不再可用。
这不是APC的错误,而只是正确的行为。
在我的情况下,它有助于暂时禁用APC(这样无论冲突如何都可以运行我的脚本),并将echo语句挂钩到我的__autoload函数中,生成传递的参数列表。加载了错误名称的类会很快显示出来,我可以修复它并重新启用APC。
希望这有助于某人。
答案 2 :(得分:0)
我之前有这个错误与APC无关,它总是帮助不仅运行缓存:清除,还检查并确保所有文件都从缓存目录中删除。
答案 3 :(得分:0)
我在开发窗口中生活的情况相同 系统与PHP 5.2.11和几个apc版本。相同 描述的情况,stat = 0一切正常,但是 当我设置stat = 1时,apache崩溃并出现错误“不能 redeclare class [some class]“。代码正在开发一个 不同的Windows系统,旁边就是生活在一个沉重的 加载linux生产服务器数月。我百分之百肯定 没有与apc相关的bug。它始于我的机器上 我重新安装操作系统后。
我花了一些时间来评论一些类包括和 意识到它适用于一些包含文件但不适用 特定的。我检查了我的代码没有明显的 阶级差异的差异。
然后我添加了一些我保存的所有包含文件 使用Zend Studio编辑器增加空格。它看起来 愚蠢我知道但它的确有效!我正在研究这个项目 与几个人和使用svn和每个人使用 不同的文本编辑器,如记事本++,editplus等...
但是我无法通过尝试保存来重现错误 文件与一些不同的编辑器,如不同的配置 ansi,utf8有/无字节标记排序等。但我确定 我的问题与文件格式有关(编码, pc / unix模式)。我想重现错误并想要 提供更详细的信息,但我尝试了另一个解决方案 项目有同样的问题,它可以工作。
我希望我能对这个问题提出另一个观点。
答案 4 :(得分:0)
为我解决这个问题的方法是确保我的要求具有相同的路径。
例如,我得到的错误是:
[apc-error] Cannot redeclare class someClass
在文件A中我有以下内容:
require_once '/path/to/someClass.php';
在与someClass.php位于同一目录的文件B中,我有以下内容:
require_once 'someClass.php';
我认为APC缓存并不理解它们是同一个文件,因为路径是为一个而不是另一个指定的。