Кэширование .mo файлов

mihdan

Новичок
РНР установлен в качестве модуля Apache.
Сайт мультиязычный. Для вывода языков используется gettext().
Переводы лежат в файлах ru.mo, en.mo и тд.

При обновлении файла .mo не происходит ровным счетом ничего, так как РНР кэширует эти файлы при первом обращении к ним и сбрасывает кэш только при перезапуске сервера.

Собственно, вопрос, как сбросить кэш не прибегая к перезагрузке сервера?

Пока сделал так:

PHP:
<?php 
// Перевод при помощи gettext 
    putenv('LANG='.$cfg['langs'][$lng]['locale']);     
    setlocale(LC_ALL, $cfg['langs'][$lng]['locale']); 
     
    // домен по умолчанию 
    $domain = 'messages_'.$lng; 
    // Полный путь к переводу 
    $filename = "{$cfg['path']['root']}/locales/{$cfg['langs'][$lng]['locale']}/LC_MESSAGES/{$domain}.mo"; 
     
    // Есть ли файл с переводом 
    if (file_exists($filename)) { 
         
        // Последняя правка этого файла 
        $mtime = filemtime($filename); 
         
        // Новое имя файла 
        $filename_new = "{$cfg['path']['root']}/locales/{$cfg['langs'][$lng]['locale']}/LC_MESSAGES/{$domain}_{$mtime}.mo"; 
         
        // Если такого файла пока нет 
        if (!file_exists($filename_new)) { 
            // Удалить старые ревизии 
            array_map("unlink", glob("{$cfg['path']['root']}/locales/{$cfg['langs'][$lng]['locale']}/LC_MESSAGES/{$domain}_*.mo")); 
             
            // Создать новыую ревизию 
            copy($filename,$filename_new);  
        } 
         
        // Новый домен 
        $domain_new = "{$domain}_{$mtime}"; 
        bindtextdomain($domain_new, "./locales"); 
        textdomain($domain_new); 
        bind_textdomain_codeset($domain_new, $cfg['langs'][$lng]['charset']);        
         
        //echo '<!--'._('test').'-->'; 
    } 
?>

Структура папок такова

PHP:
locales 
----ru_RU 
--------LC_MESSAGES 
------------messages_ru.mo 
----en_US 
--------LC_MESSAGES 
------------messages_en.mo
 

fixxxer

К.О.
Партнер клуба
Ну например хранить в locales/$current_revision_number/xx_XX/* - всяко удобнее чем это извращение
 

mihdan

Новичок
Предлагаете при каждом изменении файла перевода переименовывать папку да еще и в скрипте править путь к этой папке?
 

fixxxer

К.О.
Партнер клуба
Ну если они меняются каждый час то неудобно, согласен. А если реалистично, то есть скажем раз в неделю, проблем не вижу. Зачем переименовывать только непонятно. Новую положить, в конфиге номер ревизии обновить, старую снести. Автоматизируется элементарно. Это что касается продакшена. На девеле я вообще проблем не вижу с рестартами, да хоть бы cgi запускать и не иметь проблемы как таковой, какая разница то.
 

mihdan

Новичок
Ладно, с этим понятно, вариант схож с моим. Попутный вопрос, почему может не работать перевод на английский язык (локаль en_US.UTF-8, язык en. Строки изначально в латиннице)?
 
Сверху