我试图从使用 Zend 框架的应用程序中获得尽可能多的性能。
我正在考虑使用启用 APC 的 Zend 服务器。但是,我需要先了解一些事情。
使用 Zend Server + Zend Framework 有什么好处,还是应该只使用任何普通系统来托管它?
沙米尔
我试图从使用 Zend 框架的应用程序中获得尽可能多的性能。
我正在考虑使用启用 APC 的 Zend 服务器。但是,我需要先了解一些事情。
使用 Zend Server + Zend Framework 有什么好处,还是应该只使用任何普通系统来托管它?
沙米尔
我对更快 ZF 的提示(从上到下尝试):
Zend_Locale::setCache(), Zend_Currency::setCache(), Zend_Db_Table::setDefaultMetadataCache(), configs...
$a
并带来性能提升。$b
任何操作码缓存当然是必须的;)(APC、ZendOptimizer 等)
无论您在哪种堆栈上运行,APC 都会有所帮助。任何类型的 OPcode 缓存都会。
在加快应用程序的速度方面,第一步是对其进行分析。使用 Xdebug 生成 cachegrind 报告,然后使用 kcachegrind 或 webgrind 之类的东西来解释它。
通过使用 Zend Framework,我通常会发现以下一些痛点:
页面级缓存将有很大帮助。任何你不需要新数据的地方,缓存它。
过去,它不再是 Zend 框架或服务器问题,它本质上开始是架构性的。您可以异步处理密集型任务吗?有时不值得优化某些东西,但值得改变用户感知以感觉更快。
有趣的想法,前几天我在 $i++ 上退格,用 ++$i 替换它。它在技术上更快,但我确信我在程序生命周期中永远不会重新获得这样做的时间。你必须在某处画线:)
Zend Server 是一个非常通用的 PHP 编译器(来自 LAM P或 WAM P堆栈的 P),但是更高级,为您提供了很好的 GUI 来设置所有内容(而不是编辑 php.ini),但更多的是导入:
如果您只寻找 APC,也许其他解决方案(我还不知道)可能更便宜,但需要 APC 建议您希望缓存和工作查询......我喜欢它。
Zend Framework 不需要使用它,但是你可以使用任何你想要的框架(或没有框架)。
很高兴您可以免费试用 ZS 全功能 30 天(APC 在 CE 中不可用 ---->>>> 错误的 APC 在 CE 中可用)
操作码缓存是您在生产环境中运行 PHP 时始终希望使用的一种扩展。Apc 是一个操作码缓存和数据缓存扩展,但在 Zend 服务器中,主要的操作码缓存称为“Optimizer plus”,我建议在决定使用 APC 之前比较两者之间的性能。Zend 服务器中还有另一个扩展,它执行数据缓存工作。许多文件包含(如在 Zend 框架中)不再是操作码缓存的问题,因为它们存储在内存中,并且不再需要很长时间才能开始使用它们。
Zend 服务器的完整(付费)版本可以通过将 PHP 监控与代码跟踪结合使用,从而获得有关应用程序中问题和未优化代码的有价值信息,从而获得另一个主要的性能提升。使用这种组合可以非常快速地解决诸如长脚本和函数执行、长 DB 查询等问题。
来源 这个技巧并不新鲜。它直接取自 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);
这是我认为可能有帮助的基本设置。