Programing

APC 캐시 항목을 지우는 방법?

crosscheck 2020. 5. 24. 12:56
반응형

APC 캐시 항목을 지우는 방법?


새 버전의 사이트를 배포 할 때 모든 APC 캐시 항목을 지워야합니다. APC.php에는 모든 opcode 캐시를 지우는 버튼이 있지만 모든 사용자 항목, 모든 시스템 항목 또는 모든 디렉토리 별 항목을 지우는 버튼이 표시되지 않습니다.

명령 줄이나 다른 방법으로 모든 캐시 항목을 지울 수 있습니까?


PHP 함수를 사용할 수 있습니다 apc_clear_cache.

호출 apc_clear_cache()하면 시스템 캐시 apc_clear_cache('user')가 지워지고 호출 하면 사용자 캐시가 지워집니다.


이 답변 중 어느 것도 실제로 명령 줄에서 APC 캐시를 지우는 데 효과적이라고 생각하지 않습니다. 프랭크 파머는 위의 댓글을 달았 과정에서 CLI 실행 아파치에서 분리합니다.

명령 줄에서 지우는 솔루션은 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']);
    

나는 그것이 모두를위한 것이 아니라는 것을 알고 있습니다 : 왜 우아한 아파치를 다시 시작하지 않습니까?

예를 들어 Centos / RedHat Linux의 경우 :

sudo service httpd graceful

우분투 :

sudo service apache2 graceful

이것은 설명서에 명시되어 있지 않지만 opcode 캐시를 지우려면 다음을 수행해야합니다.

apc_clear_cache('opcode');

편집 : 이것은 일부 이전 버전의 APC에만 적용되는 것 같습니다.

cli 스크립트는 mod_php 또는 fastcgi와 다른 프로세스에서 실행되므로 사용중인 버전에 관계없이 php cli 스크립트에서 mod_php 또는 fastcgi APC 캐시를 지울 수 없습니다. 캐시를 지우려는 프로세스 (또는 자식 프로세스)에서 apc_clear_cache ()를 호출해야합니다. curl을 사용하여 간단한 PHP 스크립트를 실행하는 것이 그러한 접근 방법 중 하나입니다.


명령에서 apc 캐시를 지우려면 : (필요한 경우 sudo 사용)

APCu

php -r "apcu_clear_cache();" 

APC

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

NGINX / PHP-FPM 스택에서 실행중인 경우 가장 좋은 방법은 php-fpm을 다시로드하는 것입니다.

service php-fpm reload (또는 시스템에 재로드 명령이 무엇이든간에)


APC 문서에 정의 된대로 :

캐시 실행을 지우려면

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

아직 언급되지 않은 명령 줄 사용의 또 다른 가능성은 curl을 사용하는 것입니다.

This doesn't solve your problem for all cache entries if you're using the stock apc.php script, but it could call an adapted script or another one you've put in place.

This clears the opcode cache:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"

Change the OB parameter to 3 to clear the user cache:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"

Put both lines in a script and call it with $PASSWORD in your env.


If you want to monitor the results via json, you can use this kind of 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);

As mentioned in other answers, this script will have to be called via http or curl and you will have to be secured if it is exposed in the web root of your application. (by ip, token...)


apc_clear_cache() only works on the same php SAPI that you want you cache cleared. If you have PHP-FPM and want to clear apc cache, you have do do it through one of php scripts, NOT the command line, because the two caches are separated.

I have written CacheTool, a command line tool that solves exactly this problem and with one command you can clear your PHP-FPM APC cache from the commandline (it connects to php-fpm for you, and executes apc functions)

It also works for opcache.

See how it works here: http://gordalina.github.io/cachetool/


The stable of APC is having option to clear a cache in its interface itself. To clear those entries you must login to apc interface.

APC is having option to set username and password in apc.php file.

enter image description here


if you run fpm under ubuntu, need to run the code below (checked on 12 and 14)

service php5-fpm reload

apc.ini

apc.stat = "1" will force APC to stat (check) the script on each request to determine if it has been modified. If it has been modified it will recompile and cache the new version.

If this setting is off, APC will not check, which usually means that to force APC to recheck files, the web server will have to be restarted or the cache will have to be manually cleared. Note that FastCGI web server configurations may not clear the cache on restart. On a production server where the script files rarely change, a significant performance boost can be achieved by disabled stats.


New APC Admin interface have options to add/clear user cache and opcode cache, One interesting functionality is to add/refresh/delete directory's from opCode Cache

APC Admin Documentation

enter image description here


A good solution for me was to simply not using the outdated user cache any more after deploy.

If you add prefix to each of you keys you can change the prefix on changing the data structure of cache entries. This will help you to get the following behavior on deploy:

  1. Don't use outdated cache entries after deploy of only updated structures
  2. Don't clean the whole cache on deploy to not slow down your page
  3. Some old cached entries can be reused after reverting your deploy (If the entries wasn't automatically removed already)
  4. APC will remove old cache entries after expire OR on missing cache space

This is possible for user cache only.


Create APC.php file

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

Run it from your browser.


My work-around for Symfony build having loot of instances at the same server:

Step 1. Create trigger or something to set a file flag (eg. Symfony command) then create marker file ..

file_put_contents('clearAPCU','yes sir i can buggy')

Step 2. On index file at start add clearing code and remove marker file.

if(file_exists('clearAPCU')){
    apcu_clear_cache();
    unlink('clearAPCU');
}

Step 2. Run app.


We had a problem with APC and symlinks to symlinks to files -- it seems to ignore changes in files itself. Somehow performing touch on the file itself helped. I can not tell what's the difference between modifing a file and touching it, but somehow it was necessary...

참고URL : https://stackoverflow.com/questions/911158/how-to-clear-apc-cache-entries

반응형