代码之家  ›  专栏  ›  技术社区  ›  Chris Williams

操作码(APC/XCache)、Zend、条令和自动加载器

  •  7
  • Chris Williams  · 技术社区  · 17 年前

    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 回复  |  直到 17 年前
        1
  •  10
  •   Benjamin Cremer    16 年前

    Zend_Session::writeClose(true); “在index.php的末尾。

    较好的 :注册为 shutdown function .
    因此,即使您使用 exit() , die() 或者 fatal error 发生:

    register_shutdown_function(array('Zend_Session', 'writeClose'), true);
    
        2
  •  3
  •   Hogberg    16 年前

    这可能与自定义会话处理和APC缓存的问题类似。如果您已经分配了一个自定义会话处理程序,那么它将在PHP中向rshutton注册。这与APC使用的例程相同,因此将在PHP中创建内部冲突,并且您的自定义会话处理程序不会在所有情况下都关闭。

    "Zend_Session::writeClose(true);" 如果您有出口,那么在index.php结尾不是最好的方法;在任何地方调用脚本。

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

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

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

        3
  •  0
  •   Justin    17 年前

    是不是还有什么别的东西弄脏了包含路径?在您的第一个APC示例中,可能尝试在该行之前注销include路径。

    XCache的那个真的很奇怪。但是这个项目已经死了,我不相信它在PHP5.2+上。试试每个加速器吧?我们运气很好。

        4
  •  0
  •   Halil Özgür    16 年前

    本杰明·克雷默,你是个救生员。虽然上述(原始)问题是会话自动加载的特殊情况,但关闭会话似乎是此类情况的一般解决方案。不过有一点值得注意:

    放置 Zend_Session::writeClose(true); 在脚本结束时,可能并不总是剪切它,因为您可能有 exit; die(); 代码中的等。在这种情况下,您可以使用

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

    register_shutdown_function('session_write_close');

    如果您不在会话中使用Zend。

    推荐文章