Как очистить записи кэша APC?

Мне нужно очистить все записи кэша APC при развертывании новой версии сайта. APC.php имеет кнопку для очистки всех кеш-кодов операций, но я не вижу кнопок для очистки всех пользовательских записей или всех записей системы или всех записей в каждом каталоге.

Можно ли очистить все записи кэша через командную строку или каким-либо другим способом?

Related of "Как очистить записи кэша APC?"

Вы можете использовать функцию PHP apc_clear_cache .

Вызов apc_clear_cache() очистит системный кеш, и вызов apc_clear_cache('user') очистит кеш пользователя.

Я не думаю, что любой из этих ответов действительно работает для очистки кэша APC от командной строки. Как заметил Фрэнк Фармер , CLI работает в процессе, отличном от Apache.

Мое решение для очистки из командной строки состояло в том, чтобы написать сценарий, который копирует сценарий очистки APC в web каталог и получает к нему доступ, а затем удаляет его. Сценарий ограничен доступом к локальному хосту.

  1. 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'); } 
  2. Сценарий очистки кеша

    Этот скрипт копирует 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, поскольку скрипт cli будет запускаться из другого процесса как mod_php или fastcgi. Вы должны вызвать apc_clear_cache () из процесса (или дочернего процесса), для которого вы хотите очистить кеш. Одним из таких подходов является использование curl для запуска простого скрипта php.

Если вы хотите очистить кеш apc в команде: (используйте sudo, если вам это нужно)

 php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');" 

Если вы работаете в стеке NGINX / PHP-FPM, лучшим вариантом является, вероятно, просто перезагрузка php-fpm

service php-fpm reload (или любая ваша команда перезагрузки может быть в вашей системе)

Другая возможность использования командной строки, еще не упомянутая, – использовать завиток.

Это не решит вашу проблему для всех записей кэша, если вы используете скрипт 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.

Если вы хотите отслеживать результаты через 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, токен …)

apc_clear_cache () работает только в одном и том же php SAPI, который вы хотите очистить. Если у вас есть PHP-FPM и вы хотите очистить кэш apc, вы делаете это через один из php-скриптов, а не в командной строке, потому что два кэша разделены.

Я написал CacheTool , инструмент командной строки, который решает именно эту проблему, и с помощью одной команды вы можете очистить кэш APC PHP-FPM из командной строки (он подключается к php-fpm для вас и выполняет функции apc)

Он также работает для opcache.

Посмотрите, как это работает здесь: http://gordalina.github.io/cachetool/

У стойки APC есть возможность очистить кеш в самом интерфейсе. Чтобы очистить эти записи, вы должны войти в интерфейс apc.

APC имеет возможность установить имя пользователя и пароль в файле apc.php.

введите описание изображения здесь

если вы запустите fpm под ubuntu, вам нужно запустить код ниже (отмечен 12 и 14)

 service php5-fpm reload 

Как определено в документе APC:

Чтобы очистить кеш-прогон:

 php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;' 

apc.ini

apc.stat = "1" заставит APC статировать (проверять) скрипт по каждому запросу, чтобы определить, было ли оно изменено. Если он был изменен, он будет перекомпилировать и кэшировать новую версию.

Если этот параметр выключен, APC не будет проверять, что обычно означает, что для принудительной проверки APC необходимо перезапустить веб-сервер или очистить кеш вручную. Обратите внимание, что конфигурации веб-сервера FastCGI могут не очищать кеш при перезагрузке. На производственном сервере, где файлы сценариев редко меняются, значительное повышение производительности может быть достигнуто с помощью отключенных статистических данных.

В новом интерфейсе APC Admin есть опции для добавления / очистки кеша пользователя и кэша операций, одна интересная функция заключается в добавлении / обновлении / удалении каталога из кэша opCode

Документация администратора APC

введите описание изображения здесь

Хорошим решением для меня было просто не использовать устаревший пользовательский кеш после развертывания.

Если вы добавляете префикс для каждого из ваших ключей, вы можете изменить префикс на изменение структуры данных записей кэша. Это поможет вам получить следующее поведение при развертывании:

  1. Не используйте устаревшие записи кэша после развертывания только обновленных структур
  2. Не очищайте весь кеш при развертывании, чтобы не замедлить свою страницу.
  3. Некоторые старые кэшированные записи могут быть повторно использованы после восстановления вашего развертывания (если записи не были автоматически удалены)
  4. APC удалит старые записи кэша после истечения срока действия ИЛИ при нехватке кеша

Это возможно только для кеша пользователя.

Создать файл 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 и символическими ссылками на символические ссылки на файлы – она, похоже, игнорирует изменения в самих файлах. Как-то помогло прикосновение к файлу. Я не могу сказать, в чем разница между модификацией файла и касанием его, но почему-то это было необходимо …