Zend_Locale_Format::toNumber очень медленный в голландском языке
У меня есть веб-сайт, доступный на нескольких языках, и я вижу что-то странное во время загрузки моей страницы в разных локалях. Вот пример загрузки одной из наиболее важных страниц.
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 локали отображают страницу примерно в одно и то же время. (+/- 500мс) У меня есть довольно много чисел, которые нужно отформатировать на этой странице, поэтому серьезное влияние.
Я смотрю на это уже довольно давно, но не могу найти решение или даже объяснение этому.
Есть идеи?
2 ответа
Я только что попал в этот спектакль сам и хорошо.. нет обходного пути. За исключением использования кеша, желательно с бэкэндом 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).
Кэш PS Zend_Locale используется повторно для форматирования чисел и всего, что связано с локалью.
Ты звонишь Zend_Registry::get('Zend_Locale')
несколько раз на этой странице или он вызывается только один раз? Вы сказали, что у вас есть несколько чисел для форматирования на этой странице. Попробуйте установить значение реестра для переменной один раз в начале вашей страницы или даже в вашем контроллере:
$currLocale = Zend_Registry::get('Zend_Locale');
Если вы действительно звоните Zend_Registry
несколько раз для одного и того же значения вы, по сути, делаете одно и то же снова и снова.
Также может быть некоторое "более глубокое" различие между внутренней работой самих локалей. Ты используешь UTF-8
на основе локали или что? Это очень важно, так как некоторые локали могут содержать гораздо больше символов, чем другие. Также может быть определенная известная / неизвестная проблема с этим набором локалей в конкретной ОС. Под какой ОС вы это запускаете?