无法重新声明类sfconfig

时间:2009-11-30 23:05:19

标签: php symfony1 apc

我在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_ *函数 - 结果是一样的。有谁知道为什么会这样?

5 个答案:

答案 0 :(得分:3)

答案 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缓存并不理解它们是同一个文件,因为路径是为一个而不是另一个指定的。