tags:

views:

1113

answers:

5

I am running Symfony (1.2.9) with PHP Version 5.2.11 on Windows XP.

I have APC installed (Version 3.0.19)

I can run PHP script to prove that apc is working correctly (works). However, when I try to use APC calls in a symfony action, I get this error (in the apache error.log file):

[apc-error] Cannot redeclare class sfconfig

Which promptly crashes Apache.

I tried using the Symfony sfAPCCache wrapper, and then directly calling the apc_* functions - the result is the same. Does anyone know why this is happening ?

+1  A: 

Checkout these threads:

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

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

Arthur Frankel
I will mark your answer as accepted. It provided a fix (which allowed me to continue working), but did not explain why I had to set the apc.stat config to zero (off). At least it works, so I can continue developing on my windows box. I will not have this problem when I move onto my server, which has a REAL OS (not a mickey mouse one).
Stick it to THE MAN
If possible you may want to try a more recent version of php/APC and see if the error still remains.
Arthur Frankel
A: 

Ive had this error before unrelated to APC and it always helped to not only run the cache:clear but also to check and make sure all files were deleted from the cache dir.

prodigitalson
A: 

I was living the same situation on my development windows system with php 5.2.11 and several apc versions. Same situation as described, with stat=0 everything works, but when I set stat=1, apache crashes with error "cannot redeclare class [some class]". The code is working on a different windows system, beside it is live on a heavily loaded linux production server for months. I'm %100 sure there is no bug related to apc. It started on my machine after I reinstalled my OS.

I spent some time commenting out some class includes and realized that it works with some include files but not with specific ones. I checked my code there is no noticeable difference on the class differences.

Then I saved all of my include files with adding some additional whitespaces with Zend Studio's editor. It looks stupid I know but it works!!! I'm working on the project with several people and using svn and everybody uses different text editors like notepad++, editplus etc...

However I couldn't reproduce the error by trying save the file with some different editors with different configs like ansi, utf8 with/without byte-mark ordering etc. But I'm sure my problem is something related to file format (encoding, pc/unix mode). I'd like to reproduce the error and want to give more detailed info but I tried my solution on another project with same problem, it works either.

I hope I could give another perspective to the issue.

cevher bilger
A: 

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.

Joshua Ross
A: 

Today this error happened to me, too, and I became aware of why it can happen (among possible other reasons).

APC correctly identifies every class by a fully qualified name, which includes the classes namespace. Unfortunately you can end up referring to the same class with various names.

For example:

I had a wrong "use" statement in my code, importing a non-namespaced class as if it had been inside a namespace.

The class, say "MyClass" was in namespace "\", meaning that its correct and fully qualified name was "\MyClass".

At some point the class was referred to by its unqualified name "MyClass", and got autoloaded. In another file I (wrongly) referred to the class with a namespace prefix in a use statement, say "use \SomeNamespace\MyClass;". Consequently the class was (again) passed to my global __autoload() method, but with a different name. To make it worse, the autoload method was smart enough to find the class anyway.

Instantly, my script stopped working and all that happened was APC writing "[apc-error] Cannot redeclare class ..." into the Apache Web Server error.log. My pages were no longer available.

This is not an APC bug whatsoever, but simply correct behaviour.

In my case it helped to temporarily disable APC (so that my script would be run regardless of the conflict), and hook an echo statement into my __autoload function producing a list of the parameters passed. The class loaded with a wrong name would show up quickly, and I could fix it and reenable APC.

Hope this helps someone.

Daniel Alvarez Arribas