Как очистить записи в кэше APC? - PullRequest
170 голосов
/ 26 мая 2009

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

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

Ответы [ 18 ]

143 голосов
/ 26 мая 2009

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

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

115 голосов
/ 27 августа 2010

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

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

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

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful
29 голосов
/ 16 июня 2010

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

apc_clear_cache('opcode');

РЕДАКТИРОВАТЬ: Это относится только к некоторым старым версиям APC.

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

10 голосов
/ 21 января 2014

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

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
9 голосов
/ 23 апреля 2013

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

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

5 голосов
/ 06 августа 2015

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

Для очистки кеша выполните:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
4 голосов
/ 01 февраля 2013

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

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

3 голосов
/ 23 сентября 2014

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

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

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

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

...