【问题标题】:Opcode (APC/XCache), Zend, Doctrine, and Autoloaders操作码 (APC/XCache)、Zend、Doctrine 和自动加载器
【发布时间】:2009-09-01 21:31:37
【问题描述】:

我正在尝试使用 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 几乎是提高性能的必要条件,但我似乎无法让它发挥作用。有什么想法吗?

【问题讨论】:

    标签: zend-framework doctrine apc opcode xcache


    【解决方案1】:

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

    更好:注册为shutdown function
    所以即使你使用exit()die()fatal error 也会执行:

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

    【讨论】:

    • register_shutdown_function 的功劳归于 hogberg 和 battal。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      还有什么东西弄脏了包含路径吗?也许尝试在您的第一个 APC 示例中在该行之前注销包含路径。

      XCache 真的很奇怪。不过,那个项目已经死了,我不相信它在 PHP 5.2+ 上。改用加速器?我们运气最好。

      【讨论】:

      【解决方案4】:

      Benjamin Cremer,你是救生员。虽然上述(原始)问题是使用会话自动加载的特殊情况,但关闭会话似乎是此类情况的一般解决方案。不过请注意:

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

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

      或者,简单地说

      register_shutdown_function('session_write_close');

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

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        相关资源
        最近更新 更多