Exception sfErrorNotifierPlugin:;“违约”;上下文不存在

Exception sfErrorNotifierPlugin:;“违约”;上下文不存在,exception,plugins,symfony1,Exception,Plugins,Symfony1,我已安装了sfErrorNotifierPlugin。当两个选项reportErrors/reportPHPErrors reportPHPWarnings/reportWarnings都设置为false时,一切正常。但我想捕捉PHP异常和警告以接收电子邮件,但随后我的所有任务都失败了,包括清除缓存。经过几个小时的测试,我100%确定问题出在set\u exception\u处理程序/set\u error\u处理程序上 还有一个类似的问题: 但是作者在自定义任务方面遇到了问题。在我的例子中,即

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

还有一个类似的问题:
但是作者在自定义任务方面遇到了问题。在我的例子中,即使是内置任务也会失败。

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


关于“为什么sfContext::getInstance()不好”有一篇有趣的博文,其中详细介绍了这一点-

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

检查,如果你真的需要上下文

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


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

很遗憾,这个问题无法通过这种方式解决。使用sfErrorNotifierPlugin,我启用了报告PHP警告/错误(symfony异常除外),这导致了巨大的问题,例如清除缓存之类的内置任务失败

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


执行任务时,一切正常。当从浏览器启动应用程序时,出现异常/警告时会发送电子邮件(可能有人会发现它很有用)。

在类内执行操作之前,可以测试实例的存在性。比如:

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

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

在我的具体案例中,我注意到提出了一个警告:

警告:ob_start():在第155行的/var/www/ncsoft_qa/lib/vendor/symfony/lib/config/sfApplicationConfiguration.class.php中找不到函数“”或函数名无效

注意: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)很好

虽然您可以在任务和测试中初始化上下文实例,但它确实会减慢速度。我认为“重构”是一个更好的答案?如果要在任务中使用上下文,则必须执行:$context=sfContext::createInstance($this->configuration);在任务中没有任何其他方式(据我所知)…谢谢你的回答。是的,我知道sfContext::getInstance不好,我知道。
if(sfContext::hasInstance())
  $this->microsite_id = sfContext::getInstance()->getUser()->getAttribute('active_microsite');