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 на основе локали или что? Это очень важно, так как некоторые локали могут содержать гораздо больше символов, чем другие. Также может быть определенная известная / неизвестная проблема с этим набором локалей в конкретной ОС. Под какой ОС вы это запускаете?

Другие вопросы по тегам