2009-11-30 89 views
2

我在Windows XP上运行Symfony(1.2.9)和PHP版本5.2.11。无法重新声明类sfconfig

我有APC安装(版本3.0.19)

我可以运行PHP脚本来证明APC正常工作(工程)。然而,当我尝试使用APC在symfony的行动电话,我得到这个错误(在Apache的error.log文件):

[APC-错误]不能重新声明类sfconfig

哪个及时崩溃的Apache。

我试过使用Symfony sfAPCCache包装,然后直接调用apc_ *函数 - 结果是一样的。有谁知道为什么会发生这种情况?

回答

3
+0

我会将您的答案标记为已接受。它提供了一个修复(它允许我继续工作),但没有解释为什么我必须将apc.stat配置设置为零(关闭)。至少它可以工作,所以我可以继续在我的Windows系统上开发。 当我移动到具有真实操作系统的服务器(不是米奇鼠标)时,我不会遇到这个问题。 – 2009-12-01 10:26:56

+0

如果可能,您可能想尝试更新版本的php/APC并查看错误是否仍然存在。 – 2009-12-01 18:10:56

0

Ive有这个错误之前无关的APC,它总是帮助,不仅运行缓存:明确还要检查并确保所有文件已从缓存目录中删除。

0

我的生活在我的开发windows 系统与php 5.2.11和几个apc版本的情况相同。同样的 情况描述,与stat = 0一切正常,但 当我设置stat = 1时,apache崩溃,错误“不能 redeclare类[some class]”。该代码正在处理一个不同的windows系统,除此之外,它几个月来一直在重载 加载的linux生产服务器上。我是%100肯定 没有与apc相关的错误。它在我重新安装操作系统后在我的机器 上启动。

我花了一些时间评论出一些类包括和 意识到它可以与一些包含文件,但不与 特定的。我检查了我的代码没有明显的 差别。

然后我保存了所有的包含文件,并在Zend Studio的编辑器中添加了一些 附加的空格。它看起来 愚蠢我知道,但它的作品!我工作的项目 几个人使用SVN和每个人都使用不同的 文本编辑器如记事本++,EditPlus的等等

但是我不能试图保存 文件与一些不同重现错误编辑器有不同的配置,如 ansi,utf8有/无字节标记排序等。但我相信 我的问题是与文件格式(编码, pc/unix模式)有关。我想重现错误,并想 提供更详细的信息,但我尝试了我的解决方案在另一个 项目与同样的问题,它也可以。

我希望我能给出另一个观点来解决这个问题。

0

对我来说,解决这个问题就是确保我的需求具有相同的路径。

例如,我得到的错误是:
[apc-error] Cannot redeclare class someClass

在文件AI了下列文件:
require_once '/path/to/someClass.php';

在驻留在相同的目录中someClass.php文件B我有以下内容:
require_once 'someClass.php';

我相信APC缓存不理解它们是相同的文件,因为路径是特定的编辑一个而不是另一个。

2

今天这个错误也发生在我身上,我意识到它为什么会发生(可能是其他原因)。

APC通过完全限定名称(包括类名称空间)正确标识每个类。不幸的是,你最终可能会用不同的名字来引用同一个类。

例如:

我的代码中有一个错误的“使用”的声明,导入一个非命名空间类,仿佛它已经在命名空间里。

该类称为“MyClass”,名称空间为“\”,表示其正确且完全限定的名称为“\ MyClass”。

在某些时候,这个类被它的非限定名称“MyClass”引用,并被自动加载。在另一个文件中,我(错误地)在use语句中使用名称空间前缀引用该类,并说“use \ SomeNamespace \ MyClass;”。因此,该类(再次)传递给我的全局__autoload()方法,但名称不同。更糟的是,autoload方法足够聪明,无论如何都能找到类。

瞬间,我的脚本停止工作和所发生的一切是APC写作“[APC-错误]不能重新声明类......”到Apache Web服务器error.log中。我的页面不再可用。

这不是一个APC错误,但只是正确的行为。

对我来说,它有助于暂时禁用APC(让我的脚本将不考虑冲突的运行),以及勾回声陈述了我的__autoload函数产生传递的参数列表。装载了错误名称的类会很快显示,我可以修复它并重新启用APC。

希望这可以帮助别人。