Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Opcode (APC/XCache), Zend, Doctrine, and Autoloaders

I am trying to use either APC or XCache as an opcode to cache my php pages. I am using it with Zend and Doctrine and it's having a problem with the autoloader.

If I try with APC, I get the following:

Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: 
  Class Doctrine_Event could not be loaded in 
  C:\\[mydir]\\library\\doctrine\\Doctrine\\Record.php on line 777

If I try with XCache I get the following:

PHP Fatal error: Cannot redeclare class Zend_Registry in 
  C:\\[mydir]\\library\\zendframework\\Zend\\Registry.php on line 0

I'm running Zend 1.9.1, Doctrine 1.1 on a windows box.

My bootstrap is as follows:

set_include_path(dirname(__FILE__).'/../library/zendframework'
. PATH_SEPARATOR . dirname(__FILE__).'/../library/doctrine'.....

require 'Zend/Loader/Autoloader.php';

$loader = Zend_Loader_Autoloader::getInstance();
$loader->suppressNotFoundWarnings(false);
$loader->setFallbackAutoloader(true);

From what I've read, using APC or xcache is almost a must for performance, but I can't seem to get it working. Any ideas?

like image 937
Chris Williams Avatar asked Sep 01 '09 21:09

Chris Williams


2 Answers

You could put a "Zend_Session::writeClose(true);" at the end of your index.php.
This will write the session into a persistent state before necessary Objects (Zend_Loader etc.) get destructed.

Better: Register it as shutdown function.
So it will be executed even if you use exit(), die() or a fatal error occures:

register_shutdown_function(array('Zend_Session', 'writeClose'), true);
like image 162
Benjamin Cremer Avatar answered Nov 09 '22 17:11

Benjamin Cremer


It is probably similar to the problem with custom session handling and APC-cache. If you have assigned a custom session handler it is registered with RSHUTDOWN in PHP. It is the same routine that APC uses and will therefor create an internal conflict in PHP and your custom session handler will not close in all situations.

So you will have to make sure you manually close the custom session handler at shutdown

Putting a "Zend_Session::writeClose(true);" at the end of your index.php is not the best way to do that in case you have any exit; calls in your scripts anywhere.

It is better to register a shutdown handler in this way:

function shutdown()
{
 Zend_Session::writeClose(true);
}

register_shutdown_function('shutdown');

Put that in top of your index.php file to make sure that the shutdown procedure is registered before any other scripts are run.

like image 29
Hogberg Avatar answered Nov 09 '22 16:11

Hogberg