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

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

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

18 ответов


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

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


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

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

  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 и unlink, которые обрабатывают ошибки. Возможно, вы захотите добавить проверки, что они успешны.

    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..

независимо от того, какую версию вы используете, вы не можете очистить кэш mod_php или fastcgi APC от скрипта 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 (или любая ваша команда перезагрузки может быть в вашей системе)


еще одна возможность использования командной строки, еще не упомянутая, - использовать 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.


Если вы хотите отслеживать результаты через 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, инструмент командной строки, который решает именно эту проблему, и с помощью одной команды вы можете очистить кэш PHP-FPM APC из командной строки (он подключается к php-fpm для вас и выполняет apc функции)

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

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


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

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

enter image description here


Если вы запускаете 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 имеет опции для добавления / очистки кэша пользователя и кэша кода операции, одна интересная функция-добавить/обновить / удалить каталог из кэша кода операции

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

enter image description here


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

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

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