7

我试图从使用 Zend 框架的应用程序中获得尽可能多的性能。

我正在考虑使用启用 APC 的 Zend 服务器。但是,我需要先了解一些事情。

使用 Zend Server + Zend Framework 有什么好处,还是应该只使用任何普通系统来托管它?

沙米尔

4

5 回答 5

26

我对更快 ZF 的提示(从上到下尝试):

优化包含路径

  • 先定义路径
  • 下一个模型
  • 最后休息

使用启用了 OPCache 的 PHP 5.5 [新]

  • 我不能强调这一点
  • 收益约 50%

缓存表元数据

  • 即使不需要其他缓存也应该被缓存
  • 我们的一个应用程序性能在 Oracle 服务器上提高了约 30%;)

使用 viewHelpers 优于使用 action()视图助手

  • 创建访问您的模型的视图助手
  • 或仅传递模型中的数据并使用视图助手对其进行格式化

使用类映射自动加载器

  • 自 ZF1.11 起
  • 最好使用剥离的 require_once 调用

最小化路径堆栈

  • ZF中有很多路径堆栈
    • 表单元素
    • 查看助手
    • 动作助手
  • 每个路径堆栈查找意味着统计调用 = 性能损失
  • 堆栈上的每个路径的默认类越来越昂贵

剥离 require_once

偏爱 render() 而不是 partial() 视图助手

  • 没有创建新的视图实例
  • 您需要在主视图内的渲染视图范围之外设置变量!
  • 你也可以用foreach + render()替换partialLoop( )

缓存任何可能的东西

  • 需要大量工作且很少更改的小块(如动态菜单)
  • 使用分析器找到容易实现的目标
    • 认为慢的可能并不那么慢
  • 缓存可以静态设置缓存的所有内容
    • 见手册——Zend_Locale::setCache(), Zend_Currency::setCache(), Zend_Db_Table::setDefaultMetadataCache(), configs...

永远不要使用视图助手action() 或动作助手actionStack()

  • 除非 100% 需要,否则切勿使用它们 - 例如用于复杂的数据输出,但请注意它们造成的性能损失
  • 他们创建了全新的调度循环并且是性能杀手!

禁用视图渲染器

试试我的超级插件

服务器端文件缩小

  • 对于非常大的文件来说这很有意义 - 硬盘始终是瓶颈
  • 即使是微优化有时也能正常工作
    • 具有所有 ZF 类路径的类映射是巨大的,在“干”操作码缓存和 HDD 处于压力下时,条带化空格并替换长变量$a并带来性能提升。$b

任何操作码缓存当然是必须的;)(APC、ZendOptimizer 等)

于 2011-01-17T21:55:50.053 回答
3

无论您在哪种堆栈上运行,APC 都会有所帮助。任何类型的 OPcode 缓存都会。

在加快应用程序的速度方面,第一步是对其进行分析。使用 Xdebug 生成 cachegrind 报告,然后使用 kcachegrind 或 webgrind 之类的东西来解释它。

通过使用 Zend Framework,我通常会发现以下一些痛点:

  • 配置文件的计算量非常大。一旦你有了最终的配置对象,缓存它!
  • 文件包含真的很贵,试着把它们降到最低限度。如果您经常为基于反射的东西打开文件,请将输出缓存在那里。
  • 数据库调用可能很昂贵,但通常不是房间里的熊,除非它们是中心任务。

页面级缓存将有很大帮助。任何你不需要新数据的地方,缓存它。

过去,它不再是 Zend 框架或服务器问题,它本质上开始是架构性的。您可以异步处理密集型任务吗?有时不值得优化某些东西,但值得改变用户感知以感觉更快。

有趣的想法,前几天我在 $i++ 上退格,用 ++$i 替换它。它在技术上更快,但我确信我在程序生命周期中永远不会重新获得这样做的时间。你必须在某处画线:)

于 2011-01-17T04:47:59.343 回答
1

Zend Server 是一个非常通用的 PHP 编译器(来自 LAM P或 WAM P堆栈的 P),但是更高级,为您提供了很好的 GUI 来设置所有内容(而不是编辑 php.ini),但更多的是导入:

  • 装甲运兵车
  • 缓存(数据 i 页级别)
  • 工作查询
  • 带调试的高级监控

如果您只寻找 APC,也许其他解决方案(我还不知道)可能更便宜,但需要 APC 建议您希望缓存和工作查询......我喜欢它。

Zend Framework 不需要使用它,但是你可以使用任何你想要的框架(或没有框架)。

很高兴您可以免费试用 ZS 全功能 30 天(APC 在 CE 中不可用 ---->>>> 错误的 APC 在 CE 中可用)

于 2011-01-16T23:22:30.783 回答
1

操作码缓存是您在生产环境中运行 PHP 时始终希望使用的一种扩展。Apc 是一个操作码缓存和数据缓存扩展,但在 Zend 服务器中,主要的操作码缓存称为“Optimizer plus”,我建议在决定使用 APC 之前比较两者之间的性能。Zend 服务器中还有另一个扩展,它执行数据缓存工作。许多文件包含(如在 Zend 框架中)不再是操作码缓存的问题,因为它们存储在内存中,并且不再需要很长时间才能开始使用它们。

Zend 服务器的完整(付费)版本可以通过将 PHP 监控与代码跟踪结合使用,从而获得有关应用程序中问题和未优化代码的有价值信息,从而获得另一个主要的性能提升。使用这种组合可以非常快速地解决诸如长脚本和函数执行、长 DB 查询等问题。

于 2011-01-17T08:37:07.920 回答
0

来源 这个技巧并不新鲜。它直接取自 Zend Framework 文档,网址为:Zend Framework Performance Guide,我使用了一些我已经跳过的内容。

使用 Zend_Loader 并删除所有 require_once

我们实际上不能删除所有 require_once 语句。我们必须至少有一个 require_once 才能加载 Zend_Loader。首先,激活 Zend Loader。

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

接下来将删除 Zend 目录中所有文件的所有 require_once 语句。如果您使用的是 Eclipse PDT,则可以使用查找和替换功能。

使用 Zend_Cache 缓存 Zend_Db_Table 元数据

当您使用 Zend_Db_Table(我有时只使用 Zend_Db)时,您会注意到当您尝试从数据库中检索数据时,调用的第一个查询是 DESCRIBE 表。Zend_Db_Table 使用 DESCRIBE 查询的信息在 SELECT 上发挥它的魔力。

当我分析我的查询时,我注意到 DESCRIBE 查询是最长的查询(在大多数情况下),这意味着检索操作的开销很大。你有两个选择:

(A) 不要使用 Zend_Db_Table (去 Zend_Db) (B) 缓存 MetaData

在这篇文章中,我将使用 MetaData 的缓存。在您的引导文件中,放置以下代码:

//Caching
$frontendOptions = array(
                    'lifetime'                  => 25200,
                    'automatic_serialization'   => true
                    );
$backendOptions  = array(
                     'cache_dir'                => APPLICATION_PATH . '/tmp'
                    );          
$cache = Zend_Cache::factory(
                    'Core',
                    'File',
                    $frontendOptions,
                    $backendOptions
                    );
//Cache table metadata
Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

缓存插件加载器类文件

使用插件时,Zend Framework 会根据所使用的插件包含多个文件,并处理多次迭代以找到正确的插件并包含它。使用下面的代码,它会创建一个包含这些插件文件的 include_once 语句列表。只需将这段代码包含到您的引导程序中即可。

//Plugin Loader caching
$classFileIncCache = APPLICATION_PATH .  '/data/pluginLoaderCache.php';
if (file_exists($classFileIncCache)) {
    include_once $classFileIncCache;
}
Zend_Loader_PluginLoader::setIncludeFileCache($classFileIncCache);

缓存数据

缓存数据将是优化中最重要的部分,当重复访问的数据已经缓存时,这将为您节省大量的数据库访问。设置缓存过期时间并在数据更改时清除缓存很重要。一个简单的缓存如下所示。

在您的引导程序上:

//Caching
$frontendOptions = array(
                    'lifetime'                  => 25200,
                    'automatic_serialization'   => true
                    );
$backendOptions  = array(
                     'cache_dir'                => APPLICATION_PATH . '/tmp'
                    );          
$cache = Zend_Cache::factory(
                    'Core',
                    'File',
                    $frontendOptions,
                    $backendOptions
                    );

$registry->set('cache', $dbCache);

这是我认为可能有帮助的基本设置。

于 2019-04-05T09:42:41.757 回答