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

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

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

Ответ 1

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

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

Ответ 2

Я не считаю, что какой-либо из этих ответов действительно работает для очистки кэша 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']);
    

Ответ 3

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

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

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful

Ответ 4

Это не указано в документации, но очистить кеш-код операции, который вы должны выполнить:

apc_clear_cache('opcode');

EDIT: похоже, это относится только к некоторым более старым версиям APC.

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

Ответ 5

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

APCu

php -r "apcu_clear_cache();" 

APC

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

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

Ответ 11

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

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

enter image description here

Ответ 12

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

service php5-fpm reload

Ответ 13

apc.ini

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

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

Ответ 14

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

Документация APC Admin

enter image description here

Ответ 15

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

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

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

Ответ 16

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

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

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

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

Ответ 17

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

Ответ 18

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