【问题标题】:CakePHP model loading take a whileCakePHP 模型加载需要一段时间
【发布时间】:2011-12-24 14:40:22
【问题描述】:

为什么是App::import('*', '*');,以及模型加载需要大约 3-5 毫秒?

当一个页面需要大约 100 个模型时,这很烦人;加载核心和模型大约需要 300 毫秒。

此外,我发现启用缓存系统后,加载时间并没有减少。

对于需要大量模型的应用程序,您是否知道为什么需要如此长的时间以及减少时间的另一个原因?

提前致谢!

EDIT :当我使用 file 缓存系统(将调试模式设置为 0)时,我看到文件的 creation date 属性缓存生成的总是和我上次生成的页面一样。这意味着缓存每次都在重新生成模型文件(尽管调试模式设置为 0)。这正常吗?

EDIT2 :当我使用 Notepad++ 打开模型缓存文件时,开头有尾随“nul”标志,这是我在其他缓存文件中没有的(例如 persistent em>)。

EDIT3 : 长话短说 : 为什么一个模型的加载时间和没有这个缓存系统一样长? p>

【问题讨论】:

  • FWIW,CakePHP 2 使用延迟加载修复了这个问题。你确定调试模式关闭了吗?缓存在调试中被禁用。 stackoverflow.com/questions/3402246/cache-file-model-cakephp
  • 我使用的是 CakePHP 2,而我的页面/动作使用了大多数模型,所以无论是否延迟加载,这几乎是一样的。是的,调试模式已关闭,缓存已启用。
  • 澄清一下,这个页面需要查询100个模型,瓶颈确实是加载时间?只需确保您解决了正确的问题。
  • 不,大约有 30 个型号。看看这个页面,我确信它依赖于超过 15 个模型(处理用户、标签、问题、编辑、cmets、响应、喜欢、相关......)。我刚刚做了一个观察(快速服务器的模型需要 3-5 毫秒),想知道原因并希望有解决方案。

标签: php cakephp optimization cakephp-model


【解决方案1】:

真的,我看到标签、用户、问题、评论、广告和一些自定义查找查询。 (这一页)。在这种情况下,没有必要将喜欢的、共享的或那些属性作为模型。如果你得到了这样的细化,那么你必须期望减轻加载问题。

如果您需要在一页中使用 30 个模型,那么您所做的事情是不合逻辑的,或者您的用例远远超出规范。

【讨论】:

    【解决方案2】:

    需要注意的几点:

    App:import('', '') 正在加载所有内容 - 因此仅此一项就会占用资源。如果您有一个包含 30 多个模型查询的页面 - 首先通过它们的关系获取数据。不要使用 $this->loadModel() 或 $uses 数组;这不是 CakePHP 的设计用途。在此处查看我的回复以了解更好的做法:

    cakephp: how to access another model, which has no association

    然后您可以进一步限制获取的数据(这会提高速度):

    How to limit the fields of the associated models using find method

    Re: Cache - 在 CakePHP 的书中阅读它,因为它列出了一些很好的例子。如果您遇到困难,可能值得切换到 MemCache 或其他专用系统而不是 CakePHP 平面文件。

    【讨论】:

    • 我已经在使用 APC,但无论如何,我想要的东西即使是第一次请求也不会很长。当我说 App:import('', '') 时,星号表示这里的通配符,而不是 CakePHP,用你想要的任何替换它;)
    【解决方案3】:

    优化是一项相对的任务。您最好将时间和资源投入到优化被测量为消耗最多资源的应用程序部分。如果您的瓶颈只有 3 毫秒,那么我很难理解为什么您需要进行任何优化。

    话虽如此,如果您只是一个非常好奇的人,想要找到问题的答案,我鼓励您坐下来自己对内部代码进行一些分析,以分解导致执行时间的因素. CakePHP mailing list 可能是了解 Cake 内部工作原理的另一个有用资源。

    【讨论】:

    • 这对于每个模型来说是 3-5 毫秒,因此,对于所有需要的模型来说,大约是 100 毫秒/请求,因为这对于几乎每个请求都是相同的,我认为这是真正消耗的东西很多资源。
    • 我明白这一点,但我想让你问自己一个问题:我花一周的时间值得吗?这会为我的用户提供最边际效用吗?很可能没有,但如果是这样,解决此问题的唯一方法是进行分析并弄清楚 Cake 在这 3 毫秒内做了什么。
    • 顺便说一句,正如@Abba 所说,30 个模型很多。听起来你有一个比这更重要的设计问题。
    • 我真的不这么认为。我的应用程序是一种社交网络,因此我在一个页面上有许多不同的数据要处理。我有用户数据,用户及其与其他用户的关系,他们与页面的关系,他们在页面上的 cmets,他们对页面的评分,页面的数据(页面的数据分为两个表,公共数据和本地化数据;此外,数据是版本化的)、页面的标签、页面的语言等等......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多