Подтвердить что ты не робот

Как очистить кеш-кеп 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 для этой цели.

4b9b3361

Ответ 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.