操作码(APC / XCache),Zend,Doctrine和Autoloaders

时间:2009-09-01 21:31:37

标签: zend-framework doctrine apc opcode xcache

我正在尝试使用APC或XCache作为操作码来缓存我的php页面。我在Zend和Doctrine中使用它,并且它在自动加载器上有问题。

如果我尝试使用APC,我会得到以下结果:

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

如果我尝试使用XCache,我会得到以下内容:

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

我在Windows机器上运行Zend 1.9.1,Doctrine 1.1。

我的引导程序如下:

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);

从我读过的内容来看,使用APC或xcache几乎是性能必须的,但我似乎无法让它工作。有什么想法吗?

4 个答案:

答案 0 :(得分:10)

您可以在index.php的末尾加上“Zend_Session::writeClose(true);” 这将在必要的对象(Zend_Loader等)被破坏之前将会话写入持久状态。

更好:将其注册为shutdown function 因此,即使您使用exit()die()fatal error,也会执行此操作:

register_shutdown_function(array('Zend_Session', 'writeClose'), true);

答案 1 :(得分:3)

可能类似于自定义会话处理和APC缓存的问题。如果您已分配自定义会话处理程序,则在PHP中使用RSHUTDOWN注册。这是APC使用的相同例程,因此会在PHP中创建内部冲突,并且您的自定义会话处理程序不会在所有情况下都关闭。

因此,您必须确保在关机时手动关闭自定义会话处理程序

在index.php的末尾添加"Zend_Session::writeClose(true);"并不是最好的方法,以防你有任何退出;在任何地方调用脚本。

最好以这种方式注册关机处理程序:

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

register_shutdown_function('shutdown');

将它放在index.php文件的顶部,以确保在运行任何其他脚本之前注册了关闭过程。

答案 2 :(得分:0)

还有其他东西掩盖了包含路径吗?也许在第一个APC示例中尝试注销该行之前的包含路径。

XCache非常奇怪。那个项目已经相当死了,我不相信PHP 5.2+。尝试使用eaccelerator?我们运气最好。

答案 3 :(得分:0)

本杰明克雷默,你是一个救命的人。虽然上述(原始)问题是使用会话自动加载的特殊情况,但关闭会话似乎是这种情况的一般解决方案。但请注意:

在脚本末尾放置Zend_Session::writeClose(true);可能并不总是会将其删除,因为您的代码中可能包含exit;die();等。在这种情况下,您可以使用

register_shutdown_function(array('Zend_Session', 'writeClose'), true);

或简单地

register_shutdown_function('session_write_close');

如果您不使用Zend进行会话。