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



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

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

183   18  

18 ответов:

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

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

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

    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 в вашем ОКР.

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

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

    Ничего не найдено.

Добавить ответ:
Отменить.