我有一个可以用多种语言访问的网站,我在不同地区的页面加载时间中看到了一些奇怪的东西。以下是一个比较重要的页面的加载时间示例。
en_GB = 469ms
fr_BE = 545ms
nl_BE = 1.45s
我已经发现差异是由以下代码引起的:
$format_number = Zend_Locale_Format::toNumber(
$number,
array( 'precision' => 2 , 'locale' => Zend_Registry::get( 'Zend_Locale' ) )
);
如果我删除此代码并只返回未匹配的数字,那么所有3个区域设置都会在大约相同的时间内呈现页面。(+/-500ms)我在这个页面上有相当多的数字需要格式化,因此产生了严重的影响。
我已经研究了很长一段时间,但找不到解决方案,甚至找不到解释。
有什么想法吗?
您在该页面上多次调用Zend_Registry::get('Zend_Locale')
还是只调用一次?你说你在那一页上有很多数字要格式化。尝试在页面开始时甚至在控制器中将注册表值设置为变量:
$currLocale = Zend_Registry::get('Zend_Locale');
如果您确实多次为相同的值调用Zend_Registry
,那么您实际上是在一遍又一遍地做相同的事情。
地方本身的内部运作也可能存在一些"更深层次"的差异。您使用的是基于UTF-8
的区域设置还是什么?这一点非常重要,因为有些区域可能包含比其他区域多得多的符号。特定操作系统上的这组区域设置也可能存在特定的已知/未知问题。你在什么操作系统下运行这个?
我自己刚刚达到了这个性能指标。。没有变通办法。除了使用缓存,最好使用APC后端。基于文件的缓存对我没有帮助。你可以尝试设置这个(在引导程序中的某个地方):
$frontendOptions = array(
'lifetime' => null, // no expiration
'automatic_serialization' => false // this is the default anyways
);
$backendOptions = array('cache_dir' => SITE_ROOT.'/cache');
$cache = Zend_Cache::factory('Output','File',$frontendOptions,$backendOptions);
Zend_Locale::setCache($cache);
也许这对你有帮助。
对我来说,日期格式和数字格式在本地大约需要3.5秒。如果我禁用这些功能,大约需要一秒钟才能获得页面,否则:约4.5秒(启用文件缓存和SSD硬盘驱动器)。
p.S.Zend_Locale缓存可用于数字格式化和所有与Locale相关的内容。