【问题标题】:Non-existant model class properties, no errors, and ZendFramework不存在的模型类属性,没有错误,和 ZendFramework
【发布时间】:2015-10-28 16:14:42
【问题描述】:

我们正在使用由 ZendFramework 生成的 SocialEngine。这不是直接关于 SocialEngine 的问题,尽管它是相关的。这也不是关于 ZendFramework 的具体问题。我想这里的教训广泛适用于大多数 PhP MVC 框架。

我们有一个问题,显然在高负载条件下,网站的某些部分停止显示。例如,整个小部件的内容将无法加载而没有任何明显的错误。缺乏诊断问题的错误让我抓狂。

这根本不是关于负载或优化的问题。

我可以通过从 ZendFramework 视图、模型或控制器调用不存在的类属性来重现类似的问题,例如:

<?php echo $this->article->fubar; ?>

此时,它所属的小部件将无法显示而没有任何明显的错误。当小部件本身是页面的主要显示部分时,这是有问题的。

我怀疑这些问题最终是由尚未初始化的类变量引起的,但代码库太大而无法识别没有更好的错误报告的位置。它也可能是链接对象失败的结果,例如类似:

<?php $this->article->getCategory()->getTitle(); ?>

...如果 getCategory() 方法返回 null,理论上可能会导致此行为。

此外,我相信 ZendFramework 的数据模型中的“神奇”属性导致错误报告的缺乏,它允许动态类属性,如果数据模型有一些字段“blablabla”,$this->article ->blablabla 填充了该字段的内容。但是,如果要访问的属性不是数据库字段,那么这种神奇的行为就没有多大帮助,尤其是在它禁用正常的错误报告的情况下。这也解释了为什么 $this->article->fubar();导致小部件无法以相同的方式加载。

面对这种行为时,如何从 ZendFramework 中获取准确的错误?

【问题讨论】:

  • 当您说没有错误时,您的意思是页面上没有出现,或者错误日志中也没有出现?你能在开发中重复这个问题,还是只在你的生产服务器上重复这个问题?
  • 我在错误日志或屏幕中都找不到。我的猜测是有将它们重定向到错误日志的功能,然后出于……原因……实际上没有出现。该问题同时出现在生产服务器和开发服务器上,然后在两者上都消失了,这就是为什么我认为它最终与负载有关,并且可能与外部服务的速率限制有关。无论如何:没有错误,就无法确认。

标签: php zend-framework properties error-handling socialengine


【解决方案1】:

您是否尝试通过将以下代码放入控制器的操作或小部件控制器文件中来捕获错误?

error_reporting(E_ALL);
ini_set('display_errors', TRUE);

您的某些文章可能与任何类别无关,或者相关类别已从类别表中删除,因此 $this->article()->getCategory() 为空。如果文章的类别是必填字段并且类别表中存在类别,则不应发生这种情况。您可以通过 !empty()/instanceof 检查此类代码来避免错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多