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


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

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

Author: lo_fye, 2009-05-26

18 answers

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

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

 134
Author: Travis Beale, 2009-05-26 15:14:02

Я не верю, что какой-либо из этих ответов действительно работает для очистки кэша APC из командной строки. Как Фрэнк Фармер прокомментировал выше, интерфейс командной строки выполняется в процессе, отдельном от 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']);
    
 113
Author: Jeremy Kauffman, 2017-05-23 12:26:15

Я знаю, что это не для всех, но: почему бы не сделать изящный перезапуск Apache?

Например, в случае Centos/RedHat Linux:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful
 65
Author: Tadas Sasnauskas, 2012-05-10 09:01:07

Это не указано в документации, но для очистки кэша кода операции необходимо выполнить:

apc_clear_cache('opcode');

ИЗМЕНИТЬ: Похоже, это применимо только к некоторым более старым версиям APC..

Независимо от того, какую версию вы используете, вы не можете очистить кэш APC mod_php или fastcgi из сценария командной строки php, так как сценарий командной строки будет выполняться из другого процесса, как mod_php или fastcgi. Вы должны вызвать apc_clear_cache() из процесса (или дочернего процесса), для которого вы хотите очистить кэш. Использование curl для запуск простого php-скрипта - один из таких подходов.

 29
Author: ColinM, 2013-12-11 17:52:41

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

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
 10
Author: Léo Benoist, 2014-01-21 13:24:01

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

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

 9
Author: passion4code, 2013-04-23 19:47:09

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

 4
Author: Andy Triggs, 2013-02-01 13:26:58

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

 4
Author: COil, 2015-10-13 10:25:29

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

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

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

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

 3
Author: Samuel Gordalina, 2014-09-23 14:12:02

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

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

enter image description here

 2
Author: vinothvetrivel, 2013-11-14 05:26:43

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

service php5-fpm reload
 2
Author: hrnsky, 2014-07-01 00:12:30

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

Чтобы очистить кэш, выполните:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
 2
Author: codersofthedark, 2015-08-06 06:17:43

Apc.ini

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

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

 1
Author: mal, 2014-01-27 23:14:50

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

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

enter image description here

 1
Author: Jithin Jose, 2014-07-04 01:47:47

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

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

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

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

 0
Author: mabe.berlin, 2012-12-12 15:24:27

Создать APC.php файл

foreach(array('user','opcode','') as $v ){
    apc_clear_cache($v);
}

Запустите его из своего браузера.

 0
Author: anshuman, 2014-04-24 11:44:31

Мой обходной путь для сборки 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. Запустите приложение.

 0
Author: Ajsti.pl - Maciej Szewczyk, 2017-06-07 06:51:50

У нас была проблема с APC и символическими ссылками на символические ссылки на файлы - похоже, он игнорирует изменения в самих файлах. Каким-то образом помогло прикосновение к самому файлу. Я не могу сказать, в чем разница между изменением файла и прикосновением к нему, но так или иначе это было необходимо...

 -1
Author: jakub.lopuszanski, 2010-06-17 06:42:30