优化Zend框架

问题描述 投票:6回答:5

我正试图从我的应用程序中获得尽可能多的性能,该应用程序使用Zend Framework。

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

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

包括

zend-framework zend-server
5个回答
25
投票

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

Optimize include path

  • 首先是道路
  • 模特接下来
  • 最后休息

Use PHP 5.5 with OPCache enabled [NEW]

  • 我不能强调这一点
  • 涨幅约50%

Cache table metadata

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

Favour viewHelpers over using action() view helper

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

Use classmap autoloader

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

Minimize path stacks

  • ZF中有很多路径堆栈 形式元素 查看助手 行动助手
  • 每个路径堆栈查找意味着stat call =性能损失
  • 堆栈上的每个路径的默认类越来越贵

Strip require_once

Favour render() over partial() view helper

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

Cache anything possible

  • 需要大量工作并且很少改变的小块(如动态菜单)
  • 使用分析器找到低悬的水果 你认为慢的东西可能不会那么慢
  • 缓存静态缓存集的所有内容 见手册 - Zend_Locale::setCache(), Zend_Currency::setCache(), Zend_Db_Table::setDefaultMetadataCache(), configs...

Never use view helper action() or action helper actionStack()

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

Disable viewRenderer

Try my superlimunal plugin

  • 它将包含的类合并到一个长文件中以最小化stat调用
  • 如果来自GitHub 这是从ZF2 version from EDP的港口 但要注意 - 它尚未在生产中进行测试,请谨慎使用
  • 衡量绩效收益 慢速硬盘和所有ZF课程都让我失望了 尝试用strip whitespace function最小化它

Server-side file minification

  • 它对于真正的大文件是有意义的 - 硬盘总是瓶颈
  • 甚至微优化有时也能正常工作 带有所有ZF类路径的类映射是巨大的,条带化空白并用$a$b替换长变量,在“干”操作码缓存和HDD压力下带来性能提升。

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


3
投票

无论您运行什么样的堆栈,APC都会提供帮助。任何类型的OPcode缓存都会。

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

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

  • 配置文件非常密集,无法计算。一旦你有了最终的配置对象,就把它缓存吧!
  • 文件包含非常昂贵,尝试将它们降至最低。如果您为基于反射的东西打开很多文件,请将输出缓存在那里。
  • 数据库调用可能很昂贵,但除非它们是中心任务,否则通常不是房间里的空调。

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

过去它不再是Zend Framework或服务器问题,它开始具有架构性质。你能异步地解决密集型任务吗?有时候不值得优化,但值得改变用户感知以获得更快的感觉。

有趣的想法,有一天我退缩了$ i ++以用++ $ i替换它。它在技术上更快,但我确信我花费的时间在程序生命周期中永远不会重获。你必须在某处绘制线:)


1
投票

Zend Server是一个非常普遍的PHP编译器(来自LAMP或WAMP堆栈的P),但是更先进,给你很好的GUI设置一切(而不是编辑php.ini),但更多的导入:

  • APC
  • 缓存(数据i页面级别)
  • 求职
  • 带调试的高级监控

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

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

好的,你可以尝试ZS全部免费使用30天(APC不适用于CE ---- >>>>错误的APC IS可用于CE)


1
投票

在生产中运行PHP时,操作码缓存是您一直想要使用的一个扩展。 Apc是一个操作码缓存和数据缓存扩展,但在Zend服务器中,主操作码缓存称为“优化器加”,我建议在决定使用APC之前比较2之间的性能。 Zend服务器中还有另一个扩展,用于执行数据缓存作业。许多文件包含(如在Zend框架中)不再是操作代码缓存的问题,因为它们被编译存储在内存中并且不再需要很长时间才能开始使用它们。

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


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的缓存。在你的bootstrap文件中,放下这段代码:

//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);

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

© www.soinside.com 2019 - 2024. All rights reserved.