【问题标题】:How to Increase page loading speed in Zend Framework Application如何在 Zend Framework 应用程序中提高页面加载速度
【发布时间】:2011-11-18 19:55:55
【问题描述】:

我使用 ZF 开发了应用程序。应用程序很小,但功能很多。

我使用 Zend_Application(已经在构造函数中使用自动加载器)、Zend_Layout、Zend_view、Zend_form 等。我当前的问题是,页面加载非常慢,而且在带有 XAMP 的 localhost 中也是如此。

我已启用 xdebug 来调查问题,在“tmp”文件夹中获得了一个 cachegrind 文件,并尝试使用 WinCachegrind 软件查看它。在那里,我可以看到为每个请求或页面加载运行的许多进程和函数。

另外,我已经为 firefox 安装了 YSlow 插件,并在几秒钟内观察了页面加载速度...我将速度与 ZF 和非 ZF 应用程序进行了比较。从比较来看,非 zf 应用程序的页面加载时间不到 1 秒,而 ZF 应用程序的页面加载时间至少为 6-7 秒。差别太大了。

应用程序中发生的主要事情是:

1) 每个请求都会发生数据库连接。

2) 我没有明确地将视图添加到布局中,ZF 只是根据动作名称自动将其附加到 layout.phtml。

3) 一些窗口的表单带有几个下拉框,可以从数据库中获取数据。

4) 在为每个请求从 DB 加载权限之前,已经隐含了带有 ACL 的菜单,但现在我已经对其进行了优化,以便它仅在登录期间和其余时间从Zend_Registry。

我想附上 cachegrind 文件,以便有人可以看到后台发生的事情,但我在这里看不到附加选项。

请有人帮我找到解决方案。任何形式的帮助都非常感谢。非常感谢

【问题讨论】:

  • 您知道执行数据库查询花费了多少加载时间吗?看看 DB 分析器 - framework.zend.com/manual/en/zend.db.profiler.html
  • 你能在某处链接到 cachegrind 文件吗?甚至是一个屏幕截图,给人们一个概览。否则我们无法判断真正的问题是什么。
  • 是的,当然..我会把它上传到某个地方...然后会给你链接..
  • @tim 我也触发了 zend_db_profiler 结果到萤火虫......有占位符的查询和页面的其他必需查询......总共不到 1 毫秒......对于大多数页面...
  • @Ryan 这是 cachegrind 文件的链接southkeralaprovinceocd.com/cachegrind.out.2904

标签: performance zend-framework loading


【解决方案1】:

让我们试着给出一些提示。

第一个数据库连接应该只发生一次(除非您对数据库使用多个特权访问或多个数据库)。因此,请检查您是否在 Zend_Db_Tables 对象中使用单例模式

那么你就不用Zend_Cache了。您应该真正开始使用 Zend_Cache 并构建几个缓存对象。例如,一个具有长期存储功能的文件缓存和一个存储对象的内存缓存或 Apc 缓存。然后在多个层中使用这些缓存:

  • 将 FileCache 提供给 Zend_Db_Table (defaultMetaDataCache),这样您就可以避免大量元数据查询,即要求对您使用的表的每一列进行描述的查询。
  • 存储一个或多个 Acl 对象(取决于您如何使用 Acl,如果您有一个包含所有规则的大 Acl 或多个包含子集的 Acl)。并在构建时将它们存储在中期缓存中。
  • 考虑其他用法,检测重循环、半静态内容(比如您选择列表,应将它们视为静态多少时间?)

最后,全面了解您的应用程序引擎如何工作,以及您的数据将如何增长和使用。您需要这一步才能以最佳方式使用应用程序级别缓存(例如,是否应该缓存某些元素对于用户组?是否应该为组、每个用户、每个人构建 Acl 对象,布局中的某些块应该为每个人呈现相同的内容吗?)。

【讨论】:

  • 嗨 regilero,非常感谢您的回答。首先,该应用程序将在 vpn 下运行,不会有很多用户同时在线..它不向公众开放。所以我们可以猜测用户的限制。其次,数据库中的一些表会在旅途中变得巨大。另外,ACL,一旦用户登录,他们将有某些菜单,可以访问,但他们将无法访问某个链接下的某个链接他们被允许访问的菜单......所以应用程序结构就是这样......如果某些页面有缓存,主要是表单,缓存可能非常有用。 eAccelerator 呢
  • 我说的是在应用程序中使用缓存,用于应用程序加载的对象,而不仅仅是缓存最终页面。例如,您使用他的所有规则为每个用户构建一个 ACL 对象,并缓存该对象以避免每次都重新构建它。对于 Opcode,请查看 APC,因为它也会为您提供缓存后端。
  • 嗨 regilero,好的...我正计划按照您的说法缓存对象...将检查性能差异。另外,根据您的说法,我需要检查的所有其他区域...有时我会在视图渲染中看到滞后。你的信息很有帮助。并且,希望您已经看到了 cachegrind 文件...有很多函数被调用...这让我更加担心...无论如何让我尝试使用缓存技术。 Zend_Cache 将是正确的选择...
  • 是的,我看到了缓存研磨,这让我觉得你没有任何大问题,但是很多层中有很多调用,所以通过使用缓存,你可以避免重建很多这些电话。视图渲染延迟有时是由于 Zend Form,具有很多表单元素(大约 50-100)的表单可能会很长,根据我的经验,由于装饰器插件管理,请考虑大型表单的 ViewScript 助手。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2013-02-11
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多