Как очистить записи в кэше APC?
Мне нужно очистить все записи кэша APC при развертывании новой версии сайта. APC.php имеет кнопку для очистки всех кэшей кода операции, но я не вижу кнопок для очистки всех записей пользователя, или всех системных записей, или всех записей для каждого каталога.
Можно ли очистить все записи в кэше через командную строку или каким-либо другим способом?
19 ответов
Вы можете использовать функцию PHP apc_clear_cache
,
призвание apc_clear_cache()
очистит системный кеш и вызов apc_clear_cache('user')
очистит пользовательский кеш.
Я не верю, что какой-либо из этих ответов действительно работает для очистки кэша APC из командной строки. Как заметил Фрэнк Фармер выше, CLI работает в процессе, отдельном от Apache.
Моим решением для очистки из командной строки было написать сценарий, который копирует сценарий очистки APC в web
каталог и доступ к нему, а затем удаляет его. Доступ к сценарию ограничен локальным хостом.
apc_clear.php
Это файл, который сценарий копирует в веб-каталог, получает к нему доступ и удаляет его.
<?php if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1'))) { apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode'); echo json_encode(array('success' => true)); } else { die('SUPER TOP SECRET'); }
Скрипт очистки кеша
Этот скрипт копирует apc_clear.php в веб-каталог, получает к нему доступ, затем удаляет его. Это основано на задаче Symfony. В версии Symfony обращаются к форме копирования и отмены связи Symfony, которая обрабатывает ошибки. Вы можете добавить проверки, что они успешны.
copy($apcPaths['data'], $apcPaths['web']); //'data' is a non web accessable directory $url = 'http://localhost/apc_clear.php'; //use domain name as necessary $result = json_decode(file_get_contents($url)); if (isset($result['success']) && $result['success']) { //handle success } else { //handle failure } unlink($apcPaths['web']);
Я знаю, что это не для всех, но: почему бы не сделать изящный перезапуск Apache?
Например, в случае с Centos / RedHat Linux:
sudo service httpd graceful
Ubuntu:
sudo service apache2 graceful
Это не указано в документации, но для очистки кэша кода операции вы должны сделать:
apc_clear_cache('opcode');
РЕДАКТИРОВАТЬ: Это, кажется, относится только к некоторым старым версиям APC.
Независимо от того, какую версию вы используете, вы не можете очистить кэш mod_php или fastcgi APC из скрипта php cli, так как скрипт cli будет запускаться из другого процесса, такого как mod_php или fastcgi. Вы должны вызвать apc_clear_cache() внутри процесса (или дочернего процесса), для которого вы хотите очистить кеш. Использование curl для запуска простого php-скрипта - один из таких подходов.
Если вы работаете в стеке NGINX / PHP-FPM, лучше всего просто перезагрузить php-fpm
service php-fpm reload
(или какая-либо ваша команда перезагрузки может быть в вашей системе)
Если вы хотите очистить кэш apc в команде: (используйте sudo, если вам это нужно)
php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
apc_clear_cache() работает только на том же php SAPI, который вы хотите очистить кеш. Если у вас есть PHP-FPM и вы хотите очистить кэш apc, вы должны сделать это с помощью одного из сценариев php, а НЕ командной строки, потому что два кэша разделены.
Я написал CacheTool, инструмент командной строки, который решает именно эту проблему, и с помощью одной команды вы можете очистить кэш PHP-FPM APC из командной строки (он подключается к php-fpm для вас и выполняет функции apc)
Это также работает для opcache.
Посмотрите, как это работает здесь: http://gordalina.github.io/cachetool/
Еще одна возможность использования командной строки, еще не упомянутая, заключается в использовании curl.
Это не решит вашу проблему для всех записей кэша, если вы используете стандартный скрипт apc.php, но он может вызвать адаптированный сценарий или другой, который вы установили.
Это очищает кэш кода операции:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"
Измените параметр OB на 3, чтобы очистить кэш пользователя:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"
Поместите обе строки в скрипт и назовите его с $PASSWORD в вашем env.
Как определено в документе APC:
Чтобы очистить кеш, выполните:
php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
Если вы хотите отслеживать результаты с помощью json, вы можете использовать этот вид сценария:
<?php
$result1 = apc_clear_cache();
$result2 = apc_clear_cache('user');
$result3 = apc_clear_cache('opcode');
$infos = apc_cache_info();
$infos['apc_clear_cache'] = $result1;
$infos["apc_clear_cache('user')"] = $result2;
$infos["apc_clear_cache('opcode')"] = $result3;
$infos["success"] = $result1 && $result2 && $result3;
header('Content-type: application/json');
echo json_encode($infos);
Как упоминалось в других ответах, этот сценарий нужно будет вызывать через http или curl, и вы должны быть защищены, если он отображается в корневом каталоге вашего приложения. (по ip, токен...)
Если вы запускаете fpm под Ubuntu, необходимо запустить приведенный ниже код (проверено на 12 и 14)
service php5-fpm reload
Конюшня APC имеет возможность очистить кеш в своем интерфейсе. Чтобы очистить эти записи, вы должны войти в интерфейс apc.
APC имеет возможность установить имя пользователя и пароль в файле apc.php.
apc.ini
apc.stat = "1" заставит APC проверять скрипт на каждом запросе, чтобы определить, был ли он изменен. Если он был изменен, он перекомпилирует и кеширует новую версию.
Если этот параметр выключен, APC не будет проверять, что обычно означает, что для принудительной проверки APC файлов веб-сервер должен быть перезапущен, или кэш должен быть очищен вручную. Обратите внимание, что конфигурации веб-сервера FastCGI могут не очищать кэш при перезапуске. На рабочем сервере, где файлы сценариев изменяются редко, можно добиться значительного повышения производительности с помощью отключенной статистики.
Новый интерфейс администратора APC имеет опции для добавления / очистки пользовательского кэша и кэша кода операции. Одна интересная функция - добавлять / обновлять / удалять каталоги из кэша opCode.
TL;DR: удалить файлы кеша в
/storage/framework/cache/data/
Я включил APC, но он не был установлен (и также не мог быть установлен), поэтому он выбросил
Call to undefined function Illuminate\Cache\apc_store()
.
«Хорошо, я бы просто отключил его, и он должен работать».
Ну, нет. Затем я застрял с
Call to undefined function Illuminate\Cache\apc_delete()
Хорошим решением для меня было просто больше не использовать устаревший пользовательский кеш после развертывания.
Если вы добавите префикс к каждому из ваших ключей, вы можете изменить префикс при изменении структуры данных записей кэша. Это поможет вам получить следующее поведение при развертывании:
- Не используйте устаревшие записи кэша после развертывания только обновленных структур
- Не очищайте весь кеш при развертывании, чтобы не замедлять работу вашей страницы
- Некоторые старые кэшированные записи могут быть повторно использованы после восстановления развертывания (если записи не были уже автоматически удалены)
- APC удалит старые записи в кэше после истечения срока действия ИЛИ в случае отсутствия места в кэше
Это возможно только для пользовательского кэша.
Мой обходной путь для сборки Symfony с множеством экземпляров на одном сервере:
Шаг 1. Создайте триггер или что-то, чтобы установить флаг файла (например, команда Symfony), затем создайте marker file
..
file_put_contents('clearAPCU','yes sir i can buggy')
Шаг 2. В индексном файле при запуске добавить код очистки и удалить marker file
,
if(file_exists('clearAPCU')){
apcu_clear_cache();
unlink('clearAPCU');
}
Шаг 2. Запустите приложение.
Создать файл APC.php
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
Запустите его из браузера.
У нас была проблема с APC и символическими ссылками на символические ссылки на файлы - похоже, игнорируются изменения в самих файлах. Каким-то образом выполнение касания самого файла помогло. Я не могу сказать, в чем разница между изменением файла и касанием его, но как-то это было необходимо...