Как очистить кеш-кеп php без перезагрузки Apache или изменить домен?
Это небольшой фрагмент кода из php manual:
putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');
bindtextdomain('domain', './locale');
textdomain('domain');
echo gettext('Hello');
Что будет выводить 你好, как определено в файле domain.mo
, но проблема в том, что Apache работает, gettext()
всегда возвращает результат кэширования.
Если я изменил перевод Hello на 您好 в domain.mo
, он все равно выведет 你好.
Однако для этого существует исправление, изменяя аргумент domain
bindtextdomain()
и textdomain()
на новое имя. Как от "domain"
до "domain2"
. Но мне очень больно редактировать файл php каждый раз, когда я обновляю файл .mo
.
Есть ли лучший способ сделать это, например удалить некоторые папки или вызвать некоторые функции php для выполнения задания? Чтобы я мог написать немного script для этой цели.
Ответы
Ответ 1
Каждое решение (1, 2, 3) предлагает изменить domain
, чтобы избавиться от проблемы с кешем, но это создаст много устаревшего кеша в памяти.
Итак, я вложил в источник gnu-gettext подробную информацию о стратегии кэширования (bindtextdom.c: 78.)
Когда вызывается bindtextdomain(domain, dirname)
, он проверяет наличие domain
в кеше; если это так, тогда он проверяет, совпадает ли dirname
с тем, что находится в кеше. Если это не удастся, это заставит кеш-флеш для того же домена вместо создания нового в памяти.
Исправление невероятно простое, сначала создайте фиктивную ссылку на папку locale
, где хранится ваш файл .mo
:
cd locale
ln -s . nocache
Затем добавьте одну строку до bindtextdomain()
bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');
Теперь кеш принудительно стирается каждый раз.
Обновление:
Этот хак может не работать в некоторых случаях (не удается определить точные условия.) Это решение НЕ является тем, что вы должны использовать в рабочей среде, но только для тех, кому нужно что-то исправить, сохраняя при этом httpd!
Всякий раз, когда вы можете, пожалуйста, избегайте использования gettext с самого начала, это действительно что-то древнее и должно быть устарело навсегда.
Ответ 2
Я вызвал функцию clearstatcache();
после перевода с messages.po
на messages.mo
и ее работоспособность без перезапуска apache. Загружайте каждое изменение, которое я делаю в любом языковом файле.
Ответ 3
ok, в моем случае мне нужно было перезапустить phpfpm, выполнив перезапуск службы php5.6-fpm-sp.
Если вы используете php-fpm, вы ДОЛЖНЫ перезапустить phpfpm, чтобы очистить кеш-кеш, перезапуск apache2 не работает.
Надежда полезна кому-то другому.
Ответ 4
Решение для меня состояло в том, чтобы сохранить файлы с другим именем, используя, например, дату, а затем изменить домен:
#the path for a domain, the .mo files must match the domain
#the trick to avoid permanent caching, is to use different names for the domain, like the date messages_180320151250
$domain = 'messages_180320151300';
#sets the path for a domain, the .mo files must match the domain
bindtextdomain($domain, $_SERVER['DOCUMENT_ROOT']."/apps/cp/locale");
textdomain($domain);
Ответ 5
ИМХО нет прямого способа сделать это (помимо обходного пути, о котором вы упоминали), это причина, по которой мы используем php-gettext.
Обновление: что мы начали поддерживать как motranslator, устанавливаемый Composer и совместимый со всеми версиями PHP.