Ответ 1
Вы можете использовать функцию PHP apc_clear_cache
.
Вызов apc_clear_cache()
очистит системный кеш, а вызов apc_clear_cache('user')
очистит пользовательский кеш.
Мне нужно очистить все записи кэша APC при развертывании новой версии сайта. APC.php имеет кнопку для очистки всех кеш-кодов операций, но я не вижу кнопок для очистки всех пользовательских записей или всех записей системы или всех записей в каждом каталоге.
Можно ли очистить все записи кэша через командную строку или каким-либо другим способом?
Вы можете использовать функцию PHP apc_clear_cache
.
Вызов apc_clear_cache()
очистит системный кеш, а вызов apc_clear_cache('user')
очистит пользовательский кеш.
Я не считаю, что какой-либо из этих ответов действительно работает для очистки кэша APC от командной строки. Как отмечалось выше Frank Farmer, CLI запускается в процессе, отличном от Apache.
Мое решение для очистки из командной строки состояло в том, чтобы написать script, который копирует очистку APC script в каталог web
и обращается к ней, а затем удаляет ее. script ограничен доступом к локальному хосту.
apc_clear.php
Это файл, в котором script копирует в веб-каталог, получает доступ и удаляет.
<?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');
}
Очистка кэша script
Этот script копирует 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');
EDIT: похоже, это относится только к некоторым более старым версиям APC.
Независимо от того, какую версию вы используете, вы не можете очистить кэш APC-кода mod_php или fastcgi от php cli script, так как cli script будет запускаться из другого процесса как mod_php или fastcgi. Вы должны вызвать apc_clear_cache() из процесса (или дочернего процесса), для которого вы хотите очистить кеш. Одним из таких подходов является использование curl для запуска простого PHP скрипт.
Если вы хотите очистить кэш apc в команде: (используйте sudo, если вам это нужно)
APCu
php -r "apcu_clear_cache();"
APC
php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
Если вы работаете в стеке NGINX/PHP-FPM, лучшим вариантом является, вероятно, просто перезагрузка php-fpm
service php-fpm reload
(или любая ваша команда перезагрузки может быть в вашей системе)
Как определено в документе APC:
Чтобы очистить кеш-прогон:
php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
Другая возможность использования командной строки, еще не упомянутая, - использовать curl.
Это не решит вашу проблему для всех записей кэша, если вы используете запас apc.php script, но он может вызвать адаптированный script или другой, который вы установили на место.
Это очищает кеш-код операции:
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`"
Поместите обе строки в script и вызовите его с помощью $PASSWORD в вашем env.
Если вы хотите отслеживать результаты через json, вы можете использовать этот вид script:
<?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);
Как упоминалось в других ответах, этот script должен быть вызван через http или curl, и вы должны быть защищены, если он будет открыт в корневом каталоге вашего приложения. (через ip, токен...)
apc_clear_cache() работает только в одном и том же php SAPI, который вы хотите очистить. Если у вас есть PHP-FPM и вы хотите очистить кэш apc, вы делаете это через один из php-скриптов, а не в командной строке, потому что два кэша разделены.
Я написал CacheTool, инструмент командной строки, который решает именно эту проблему, и с помощью одной команды вы можете очистить свой PHP-FPM APC кеш из командной строки (он подключается к php-fpm для вас и выполняет функции apc)
Он также работает для opcache.
Посмотрите, как это работает здесь: http://gordalina.github.io/cachetool/
Устойчивость APC имеет возможность очистить кеш в самом интерфейсе. Чтобы очистить эти записи, вы должны войти в интерфейс apc.
У APC есть возможность установить имя пользователя и пароль в файле apc.php.
если вы запустите fpm под ubuntu, вам нужно запустить код ниже (отмечено 12 и 14)
service php5-fpm reload
apc.ini
apc.stat = "1" заставит APC статировать (проверить) script по каждому запросу, чтобы определить, было ли оно изменено. Если он был изменен, он будет перекомпилировать и кэшировать новую версию.
Если этот параметр отключен, APC не будет проверять, что обычно означает, что для принудительной проверки APC необходимо перезапустить веб-сервер или очистить кеш вручную. Обратите внимание, что конфигурации веб-сервера FastCGI могут не очищать кеш при перезагрузке. На производственном сервере, где файлы script редко меняются, значительное повышение производительности может быть достигнуто с помощью отключенных статистических данных.
В новом интерфейсе APC Admin есть опции для добавления/очистки кеша пользователя и кэша операций, одна интересная функция заключается в добавлении/обновлении/удалении каталога из кэша opCode
Создайте файл APC.php
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
Запустите его из своего браузера.
Хорошим решением для меня было просто не использовать устаревший пользовательский кеш после развертывания.
Если вы добавляете префикс для каждого из ваших ключей, вы можете изменить префикс на изменение структуры данных записей кэша. Это поможет вам выполнить следующее поведение при развертывании:
Это возможно только для кеша пользователя.
Моя работа для сборки 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 и символическими ссылками на символические ссылки на файлы - она, похоже, игнорирует изменения в самих файлах. Как-то помогло прикосновение к файлу. Я не могу сказать, в чем разница между модификацией файла и касанием его, но каким-то образом это было необходимо...