【问题标题】:sfErrorNotifierPlugin: The "default" context does not existsfErrorNotifierPlugin:“默认”上下文不存在
【发布时间】:2011-05-25 11:18:52
【问题描述】:

我已经安装了sfErrorNotifierPlugin。当两个选项 reportErrors/reportPHPErrors reportPHPWarnings/reportWarnings 都设置为 false 时,一切正常。但是我想捕获 PHP 异常和警告以接收电子邮件,但是我的所有任务都失败了,包括清除缓存。经过几个小时的测试,我 100% 确定问题出在 set_exception_handler/set_error_handler。

有一个类似的问题: sfErrorNotifierPlugin on symfony task 但作者在自定义任务时遇到问题。就我而言,即使是内置任务也会失败。

【问题讨论】:

    标签: exception plugins symfony1


    【解决方案1】:

    我没有使用 sfErrorNotifierPlugin,但我遇到了““默认”上下文不存在。之前的消息。当调用sfContext::getInstance() 并且上下文根本不存在时,就会发生这种情况。我在自定义任务中经常发生这种情况。一种解决方案是在调用sfContext::getInstance() 之前添加sfContext::createInstance()。这将确保存在上下文。

    有一篇关于“为什么 sfContext::getInstance() 不好”的有趣博客文章更详细 - http://webmozarts.com/2009/07/01/why-sfcontextgetinstance-is-bad/

    【讨论】:

    • 虽然您可以在任务和测试中初始化上下文实例,但它确实会减慢速度。我认为“重构”是一个更好的答案。
    • 比如?如果你想要一个任务中的上下文,你必须这样做: $context = sfContext::createInstance($this->configuration);在任务中没有任何其他方式(据我所知)......
    • 感谢您的回答。是的,我知道 sfContext::getInstance 不好,我知道。
    【解决方案2】:

    不幸的是,这个问题无法通过这种方式解决。使用 sfErrorNotifierPlugin,我启用了报告 PHP 警告/错误(除了 symfony 异常),这导致了巨大的问题,例如clear-cache 等内置任务失败。

    我选择的方案是只在非任务模式下加载插件(项目配置类):

      public function setup()
      {
        $this->enableAllPluginsExcept('sfPropelPlugin');
        if ('cli' == php_sapi_name()) $this->disablePlugins('sfErrorNotifierPlugin');
      }
    

    执行任务时,一切正常。当从浏览器触发应用程序时,会在发生异常/警告时发送电子邮件(也许有人会发现它很有用)。

    【讨论】:

      【解决方案3】:

      Arms 已经正确地解释了这个问题。但在控制台上执行后端/维护任务时,通常不存在上下文。如果你自己处理这种情况会更容易。

      检查一下,你是否真的需要上下文?

      如果你这样做,你到底需要它做什么? 有时您只希望用户填充 created_by 字段。您可以通过硬编码用户 ID 来解决问题。

      如果您想做一些更集成的事情,请创建一个页面(将有一个上下文)并从那里触发任务。

      【讨论】:

        【解决方案4】:

        你可以在类中做某事之前测试实例的存在。喜欢:

        if(sfContext::hasInstance())
          $this->microsite_id = sfContext::getInstance()->getUser()->getAttribute('active_microsite');
        

        【讨论】:

          【解决方案5】:

          我在使用插件 sfErrorNotifier 时遇到了同样的问题。

          在我的具体情况下,我注意到出现了警告:

          Warning: ob_start(): function '' not found or invalid function name in /var/www/ncsoft_qa/lib/vendor/symfony/lib/config/sfApplicationConfiguration.class.php on line 155

          注意:ob_start():在第 155 行的 /var/www/ncsoft_qa/lib/vendor/symfony/lib/config/sfApplicationConfiguration.class.php 中创建缓冲区失败

          所以,检查文件:sfApplicationConfiguration.class.php 类,第 155 行,

          我已将“”替换为 null,然后警告消失,错误也消失!

          ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : '');不好

          ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : null);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-02
            • 1970-01-01
            • 2012-05-06
            相关资源
            最近更新 更多