2

我在 Windows XP 上运行带有 PHP 版本 5.2.11 的 Symfony (1.2.9)。

我安装了 APC(版本 3.0.19)

我可以运行 PHP 脚本来证明 apc 工作正常(工作)。但是,当我尝试在 symfony 操作中使用 APC 调用时,我收到此错误(在 apache error.log 文件中):

[apc-error] 无法重新声明类 sfconfig

这会立即使 Apache 崩溃。

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

4

5 回答 5

3

检查这些线程:

http://pecl.php.net/bugs/bug.php?id=16860

http://old.nabble.com/APC-under-WinXP-crashes-td25872662.html

于 2009-12-01T03:22:29.100 回答
2

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

APC 通过完全限定名称正确识别每个类,其中包括类名称空间。不幸的是,您最终可能会使用不同的名称来引用同一个类。

例如:

我的代码中有一个错误的“use”语句,导入了一个非命名空间类,就好像它在命名空间中一样。

类,比如“MyClass”在命名空间“\”中,这意味着它的正确且完全限定的名称是“\MyClass”。

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

瞬间,我的脚本停止工作,所发生的只是 APC 将“[apc-error] Cannot redeclare class ...”写入 Apache Web Server error.log。我的页面不再可用。

这不是任何 APC 错误,而只是正确的行为。

在我的情况下,它有助于暂时禁用 APC(这样我的脚本将在不考虑冲突的情况下运行),并将 echo 语句挂接到我的 __autoload 函数中,生成传递的参数列表。加载了错误名称的类会很快出现,我可以修复它并重新启用 APC。

希望这可以帮助某人。

于 2010-10-06T22:51:14.683 回答
0

What solved this for me was making sure my requires had the same path.

For example, the error I got was:
[apc-error] Cannot redeclare class someClass

In file A I had the following:
require_once '/path/to/someClass.php';

In file B which resides in the same directory as someClass.php I had the following:
require_once 'someClass.php';

I believe that APC caching didn't understand they were the same file because the path was specified for one and not the other.

于 2010-02-02T23:11:51.103 回答
0

在与 APC 无关之前,我曾遇到过此错误,它不仅有助于运行缓存:清除,而且还有助于检查并确保从缓存目录中删除所有文件。

于 2009-12-01T03:22:46.137 回答
0

我在我的开发 Windows 系统上使用 php 5.2.11 和几个 apc 版本生活在同样的情况下。与描述的情况相同,stat=0 一切正常,但是当我设置 stat=1 时,apache 崩溃并出现错误“无法重新声明类 [某个类]”。该代码在不同的 Windows 系统上运行,除此之外,它在负载很重的 linux 生产服务器上运行了几个月。我 %100 确定没有与 apc 相关的错误。重新安装操作系统后,它在我的机器上启动。

我花了一些时间注释掉一些类包含,并意识到它适用于一些包含文件,但不适用于特定的文件。我检查了我的代码,类差异没有明显差异。

然后我用 Zend Studio 的编辑器添加了一些额外的空格来保存我所有的包含文件。我知道它看起来很愚蠢,但它有效!我正在和几个人一起做这个项目并使用svn,每个人都使用不同的文本编辑器,比如notepad++、editplus等......

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

我希望我可以从另一个角度来看待这个问题。

于 2009-12-15T11:43:53.213 回答