Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Кэширование .mo файлов
 
 автор: mihdan   (20.01.2011 в 12:10)   письмо автору
 
 

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

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

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

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

<?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').'-->';
    
}
?>


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

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

  Ответить  
 
 автор: mihdan   (21.01.2011 в 18:42)   письмо автору
 
   для: mihdan   (20.01.2011 в 12:10)
 

up

  Ответить  
 
 автор: Косорылый   (22.01.2011 в 12:21)   письмо автору
 
   для: mihdan   (21.01.2011 в 18:42)
 

Сброс кэша
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Expires: '.date('r'));

  Ответить  
 
 автор: Trianon   (22.01.2011 в 12:55)   письмо автору
 
   для: Косорылый   (22.01.2011 в 12:21)
 

наверное всё же mihdan спрашивал не о браузерном кэше?

  Ответить  
 
 автор: mihdan   (22.01.2011 в 16:18)   письмо автору
 
   для: Косорылый   (22.01.2011 в 12:21)
 

Trianon прав: речь идет о серверном кэшировании, где сам сервер кэширует mo-файлы

  Ответить  
 
 автор: mihdan   (24.01.2011 в 17:10)   письмо автору
 
   для: mihdan   (20.01.2011 в 12:10)
 

Попутный вопрос, почему может не работать перевод на английский язык (локаль en_SU.utf-8)?

  Ответить  
 
 автор: sim5   (24.01.2011 в 17:14)   письмо автору
 
   для: mihdan   (24.01.2011 в 17:10)
 

А разве так локаль пишется? Не en_US случайно?

  Ответить  
 
 автор: mihdan   (26.01.2011 в 00:59)   письмо автору
 
   для: sim5   (24.01.2011 в 17:14)
 

Очепятка на форуме. В реальном проекте все указано правильно, но не работает английская версия

en_US.UTF-8

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования