Як очистити записи кешу APC?


170

Мені потрібно очистити всі записи кешу APC, коли я розгортаю нову версію сайту. У APC.php є кнопка для очищення всіх кеш-кодів коду, але я не бачу кнопок для очищення всіх записів користувачів, або всіх системних записів, або всіх записів Per-Directory.

Чи можливо очистити всі записи кешу за допомогою командного рядка чи іншим способом?


1
Мені було б цікаво, як очистити прострочені записи! Ви можете вказати ttl, але php.net doc каже, що він видається після наступного запиту, коли термін його дії закінчиться ...
The Surrican

Відповіді:


145

Ви можете використовувати функцію PHP apc_clear_cache.

Виклик apc_clear_cache()очистить кеш-пам'ять системи, а виклик apc_clear_cache('user')очистить кеш користувача.


20
Я виявив, що для цього за допомогою командного рядка потрібно зайти в apc.ini і встановити: apc.enable_cli = 1
lo_fye

51
lo_fye: Це насправді працює? На моєму досвіді я виявив, що APC CLI був повністю відокремлений від кешу APC апачу апарату - і це справедливо, оскільки будь-який процес CLI працює в абсолютно окремому процесі від Apache.
Френк Фермер

9
Френк Фармер: Я підтверджую, що це працює з Apache або Nginx під управлінням PHP 5.3.10 та інтерфейсом PHP-FPM. Я створив скрипт оболонки, який виконує цю командуphp -r "apc_clear_cache();"
ezraspectre

13
Це НЕ працює, якщо ви запускаєте PHP за допомогою mod_php. З тієї причини, яку заявив Френк Фармер.
Девід

11
Я запускаю Ubuntu Server 12.04 з Nginx та PHP-FPM з PHP версії 5.4. apc_clear_cache () та apc_clear_cache ('користувач') у командному рядку НЕ очищають кеш APC веб-сервера / веб-сторінок !!!
Пітер Вогелаар

117

Я не вірю, що жоден із цих відповідей насправді працює для очищення кеш-пам'яті APC з командного рядка. Як коментував вище Френк Фармер , CLI працює в процесі, відмінному від Apache.

Моє рішення для очищення з командного рядка полягало в тому, щоб написати скрипт, який копіює сценарій очищення APC в webкаталог і отримує доступ до нього, а потім видаляє його. Доступ до скрипту доступний з localhost.

  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']);

8
Ви також можете просто перезапустити сервер, наприклад Apache, якщо ви використовуєте mod_php або PHP FPM, якщо це використовуєте. Ваше рішення більш елегантне (не потрібно перезавантаження сервера), але складніше :)
El Yobo

5
Це приємніше, ніж перезапуск php-fpm / apache, оскільки він не вимагає від вашого користувача розгортання доступу до sudo. Якщо ви розгортаєтесь на декількох серверах, введення пароля sudo для кожного може набриднути.
andrew

Особисто я не проти вводити пароль sudo (мій сценарій розгортання зберігає пароль). Але я хотів би максимально уникати простоїв, тому мені цікаво промити файли APC. Для Nginx існує (не дуже простий) спосіб перезапустити без простоїв. Я не знаю для PGPfcgi, але я не думаю, що так. Чи спричинення промивання APC викликає простої?
Жульєн

@andrew Ви можете налаштувати свого користувача на використання sudo без введення пароля. Хоча якщо очистити APC все, що потрібно, це дійсно краще, як сказав Жульєн.
ChocoDeveloper

1
@Julien Я думаю, це може збільшити завантаження сервера, якщо ви зберігаєте процесорні інтенсивні результати чи щось. Я б не робив цього в годину піку.
ChocoDeveloper

68

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

Наприклад, для Centos / RedHat Linux:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful

4
Я знаю, що це не ідеально, але я радий, що ви згадали про це для швидкого та брудного рішення.
Брайан Петті

1
Вибачте за повторне відкриття цього потоку, але я зіткнувся з тією ж проблемою, і мені цікаво, чому це не cronjob робить витончений перезапуск ідеалу apache2? Які є недоліки цього підходу?
користувач2028856

@ user2028856 У цьому немає нічого поганого, крім того, що деякі не завжди можуть мати повний контроль над сервером. Тож якщо це працює для вас - використовуйте його.
Тадас Саснаускас

@TadasSasnauskas Що ви маєте на увазі під «не завжди мати повний контроль над сервером». Я маю на увазі, що запускати його кожні півгодини або близько того спричинятиме збій апачу або порушує деякі інші запущені дії, такі як резервна копія крона?
користувач2028856

@ user2028856 Я мав на увазі, що деякі можуть розміщувати свої сайти на спільному сервері без можливості перезапустити веб-сервер. Запуск граціозного перезапуску через кожні 30 хвилин має бути добре, якщо ви не запускаєте фонових працівників через cli з увімкненою apc (короткий оповідання: у деяких випадках може викликати паніку в ядрі)
Tadas Sasnauskas

29

Це не зазначено в документації, але для очищення кешу опкоду необхідно зробити:

apc_clear_cache('opcode');

EDIT: Це, здається, стосується лише старих версій APC.

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


1
Я повинен додати, якщо ви працюєте mod_php і хочете очистити кеш-пам'ять через php-режим в режимі cli, ви не можете реально зробити це, оскільки вони працюють у різних середовищах. Моє рішення полягало в тому, щоб в режимі кліпу php дзвонив через http за допомогою file_get_contents. Некрасиво, але це працює.
ColinM

Трубопровід дампа дійсного запиту fastcgi безпосередньо до php-fpm за допомогою netcat працює без необхідності встановлення справжнього сервера http, оскільки сервер php-fpm може бути відокремлений від http
baloo

Ця відповідь неправильна. Як це пояснено в документації, кеш-код опкоду завжди очищається, якщо заданий параметр! = 'User'.
naitsirch

@naitsirch Можливо, це була помилка, яку виправили в останній версії .. На час публікації відповіді це те, що працювало на мене. На жаль, я не знаю, яку версію я використовував у той час, але ця відповідь, мабуть, корисна для 25 інших людей, які нібито використовували ту саму версію, що і я.
ColinM

12

Якщо ви хочете очистити кеш-пам'ять apc в команді: (використовуйте sudo, якщо вам це потрібно)

APCu

php -r "apcu_clear_cache();" 

APC

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

Я отримую помилку на своєму терміналі, як, будь ласка, допоможіть мені "PHP Фатальна помилка: Виклик невизначеної функції apc_clear_cache () у коді командного рядка на рядок 1"
RaviPatidar

1
Ви повинні перевірити, чи правильно встановлено ваш apc за допомогою "php -m | grep apc"
Léo Benoist

9

Якщо ви працюєте на стеку NGINX / PHP-FPM, найкраще вам, мабуть, просто перезавантажити php-fpm

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


сервіс php5-fpm reload - це те, що змушує його працювати, я перевірив файл статусу apc.php і статус кешу було скинуто, мені це було потрібно після додавання опції apc.stat = 0 до php.ini
Салем,


4

Ще одна можливість використання командного рядка, поки не згадана, - це використовувати curl.

Це не вирішує вашу проблему для всіх записів кешу, якщо ви використовуєте скрипт stock 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 у вашому оточенні.


4

Якщо ви хочете відстежувати результати за допомогою 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, token ...)


3

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

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

Він також працює для opcache.

Дивіться, як це працює тут: http://gordalina.github.io/cachetool/


2

Стабільний APC має можливість очистити кеш-пам'ять у своєму інтерфейсі. Щоб очистити ці записи, ви повинні увійти в інтерфейс apc.

APC має можливість встановити ім'я користувача та пароль у файлі apc.php.

введіть тут опис зображення


Звідки ви берете цю сторінку?
Pacerier

@Pacerier Цей інтерфейс ви отримаєте, якщо php-apcу вашій системі встановлений пакет.
Незнайомець

2

якщо ви запускаєте fpm під ubuntu, потрібно запустити код нижче (встановлено прапорець 12 і 14)

service php5-fpm reload

1

apc.ini

apc.stat = "1" змусить APC статувати (перевіряти) сценарій у кожному запиті, щоб визначити, чи він був змінений. Якщо він був змінений, він буде перекомпілювати та кешувати нову версію.

Якщо цей параметр вимкнено, APC не перевірятиме, що зазвичай означає, що для примушування APC до повторної перевірки файлів веб-сервер доведеться перезапустити або кеш потрібно буде очистити вручну. Зауважте, що конфігурації веб-сервера FastCGI можуть не очистити кеш при перезапуску. На виробничому сервері, де файли сценаріїв рідко змінюються, значне підвищення продуктивності може бути досягнуто неможливою статистикою.



0

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

Якщо ви додасте префікс до кожної з клавіш, ви можете змінити префікс про зміну структури даних записів кешу. Це допоможе вам отримати таку поведінку під час розгортання:

  1. Не використовуйте застарілі записи кешу після розгортання лише оновлених структур
  2. Не очищайте весь кеш при розгортанні, щоб не сповільнити вашу сторінку
  3. Деякі старі кешовані записи можна повторно використовувати після скасування розгортання (якщо записи вже не були видалені автоматично)
  4. APC видалить старі записи кеша після закінчення терміну дії АБО у відсутньому просторі кешу

Це можливо лише для кешу користувача.


0

Створіть файл APC.php

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

Запустіть його зі свого браузера.


2
Наскільки я розумію, екземпляр CLI не поділиться на той самий сегмент кеш-пам'яті APC, тому це не зробить нічого, крім очищення порожнього, ізольованого сегмента кешу APC.
AB Carroll

залежно від дистрибутива та конфігурацій Кеш APC може мати окремий сегмент пам'яті, я його оновлюю для більш загального рішення.
anshuman

0

Моя робота щодо побудови 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. Запустіть додаток.


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.