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


170

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

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


1
만료 된 항목을 지우는 방법에 관심이 있습니다! 당신은 ttl을 지정할 수 있지만, php.net doc는 다음 요청이 만료 될 때 다음 요청에서 영구 삭제되었다고 말합니다.
Surrican

답변:


145

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

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


20
apc.enable_cli = 1 : 나는 당신이 apc.ini와 세트로 이동하는 데 필요한 명령 줄을 통해이 일을 발견
lo_fye

51
lo_fye : 실제로 작동합니까? 필자의 경험에 따르면 APC CLI는 Apache의 APC 캐시와 완전히 분리되어 있으며 CLI 프로세스는 Apache와 완전히 별도의 프로세스로 실행되기 때문에 적절합니다.
Frank Farmer

9
Frank Farmer : PHP 5.3.10을 실행하는 Apache 또는 Nginx와 PHP-FPM 인터페이스에서 작동합니다. 이 명령을 실행하는 쉘 스크립트를 만들었습니다php -r "apc_clear_cache();"
ezraspectre

13
mod_php를 사용하여 PHP를 실행하면 작동하지 않습니다. 프랭크 파머가 말한 이유.
David

11
Nginx로 Ubuntu Server 12.04를, PHP 버전 5.4로 PHP-FPM을 실행합니다. 명령 행의 apc_clear_cache () 및 apc_clear_cache ( 'user')는 웹 서버 / 웹 페이지의 APC 캐시를 지우지 않습니다 !!!
Pieter Vogelaar

117

이 답변 중 어느 것도 실제로 명령 줄에서 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']);

8
mod_php를 사용하는 경우 Apache 또는 서버를 사용하는 경우 PHP FPM과 같이 서버를 다시 시작할 수도 있습니다. 귀하의 솔루션은 더 우아하고 (서버를 다시 시작할 필요는 없지만) 더 복잡합니다 :)
El Yobo

5
배포 사용자에게 sudo 액세스 권한이 필요하지 않기 때문에 php-fpm / apache를 다시 시작하는 것보다 좋습니다. 여러 서버에 배포하는 경우 각각 sudo 암호를 입력하면 번거로울 수 있습니다.
Andrew

개인적으로 sudo 비밀번호를 입력하지 않아도됩니다 (배포 스크립트가 비밀번호를 저장함). 그러나 가능한 다운 타임을 피하고 싶습니다. 이것이 APC 파일 플러시에 관심이있는 이유입니다. Nginx의 경우 다운 타임없이 다시 시작하는 쉬운 방법이 있습니다. 나는 PGPfcgi를 모른다. 그러나 나는 그렇게 생각하지 않는다. 플러싱 APC가 다운 타임을 유발합니까?
Julien

@andrew 비밀번호를 입력하지 않고 sudo를 사용하도록 사용자를 구성 할 수 있습니다. Julien이 말한 것처럼 APC를 지우는 것이 전부이지만 실제로 더 좋습니다.
ChocoDeveloper

1
@Julien CPU 집약적 결과 또는 무언가를 저장하는 경우 서버로드가 증가 할 수 있습니다. 나는 피크 시간에 그것을하지 않을 것입니다.
ChocoDeveloper

68

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

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

sudo service httpd graceful

우분투 :

sudo service apache2 graceful

4
나는 이것이 이상적이지 않다는 것을 알고 있지만, 빠르고 더러운 해결책으로 이것을 언급하게되어 기쁘다.
Bryan Petty

1
이 스레드를 다시 열어서 미안하지만 같은 문제가 발생하는데 왜 cronjob이 우아한 apache2를 다시 시작하는 것이 이상적이지 않은지 궁금합니다. 이 접근법의 단점은 무엇입니까?
user2028856

@ user2028856 일부는 항상 서버를 완전히 제어 할 수있는 것 외에는 아무 문제가 없습니다. 그것이 효과가 있다면 사용하십시오.
Tadas Sasnauskas

@TadasSasnauskas "항상 서버를 완전히 제어 할 수있는 것은 아닙니다"는 무엇을 의미합니까? 30 분마다 실행하면 아파치가 충돌하거나 cron 백업과 같은 다른 실행중인 작업이 중단됩니까?
user2028856

@ user2028856 일부는 웹 서버를 다시 시작하지 않고도 공유 서버에서 사이트를 호스팅 할 수있었습니다. 점잖은 재시작 실행하는 모든 30 분은 잘 당신이 APC와 CLI를 통해 배경 노동자를 실행하지 마십시오 (긴 이야기의 짧은 : 당황 커널이 발생할 수있는 경우)를 활성화 부여해야
타 다스 Sasnauskas

29

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

apc_clear_cache('opcode');

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

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


1
mod_php를 실행 중이고 cli-mode php를 통해 캐시를 지우려면 두 가지가 다른 환경에서 실행 중이므로 실제로이 작업을 수행 할 수 없습니다. 내 솔루션은 cli 모드 PHP가 file_get_contents를 사용하여 http를 통해 자체적으로 호출하도록하는 것입니다. 추악하지만 작동합니다.
ColinM

PHP는 - FPM 서버가 HTTP 하나에서 분리 될 수 있으므로 실제 HTTP 서버를 설치하지 않고 직접 netcat을 작품으로 PHP-FPM에 대한 유효한 FastCGI를 요청의 덤프를 Pipe'ing
baloo

이 답변은 잘못되었습니다. 설명서에 설명 된 것처럼 지정된 매개 변수가! = 'user'이면 opcode 캐시가 항상 지워집니다.
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 치명적인 오류 : 1 행의 명령 행 코드에서 정의되지 않은 함수 apc_clear_cache () 호출"
RaviPatidar

1
"php -m | grep apc"로 apc가 제대로 설치되었는지 테스트해야합니다
Léo Benoist

9

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

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


service php5-fpm reload is a work. apc.php 상태 파일을 확인하고 캐시 상태가 재설정되었습니다. 옵션 apc.stat = 0을 php.ini에 추가 한 후에 필요했습니다
Salem

5

APC 문서에 정의 된대로 :

캐시 실행을 지우려면

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

4

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

이것은 주식 apc.php 스크립트를 사용하는 경우 모든 캐시 항목에 대한 문제를 해결하지는 못하지만, 적합한 스크립트 나 다른 스크립트를 호출 할 수 있습니다.

그러면 opcode 캐시가 지워집니다.

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`"

두 줄을 스크립트에 넣고 env에서 $ 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, 토큰으로 ...)


3

apc_clear_cache ()는 캐시를 지우려는 동일한 PHP SAPI에서만 작동합니다. PHP-FPM이 있고 apc 캐시를 지우려면 두 캐시가 분리되어 있기 때문에 명령 행이 아닌 PHP 스크립트 중 하나를 통해 처리해야합니다.

CacheTool 을 작성 했습니다 이 문제를 정확하게 해결하는 명령 줄 도구 인 하나의 명령으로 명령 줄에서 PHP-FPM APC 캐시를 지울 수 있습니다 (php-fpm에 연결하고 apc 함수를 실행합니다)

opcache에서도 작동합니다.

작동 방식보기 : http://gordalina.github.io/cachetool/


2

APC의 안정은 인터페이스 자체에서 캐시를 지우는 옵션이 있습니다. 해당 항목을 지우려면 apc 인터페이스에 로그인해야합니다.

APC에는 apc.php 파일에서 사용자 이름과 비밀번호를 설정하는 옵션이 있습니다.

여기에 이미지 설명을 입력하십시오


이 페이지는 어디서 구할 수 있습니까?
Pacerier

@Pacerier php-apc시스템에 패키지가 설치되어 있으면이 인터페이스를 얻게 됩니다.
낯선 사람

2

우분투에서 fpm을 실행하는 경우 아래 코드를 실행해야합니다 (12 및 14에서 확인)

service php5-fpm reload

1

apc.ini

apc.stat = "1"은 APC가 각 요청에 대해 스크립트를 통계 (체크)하여 수정되었는지 확인합니다. 수정 된 경우 새 버전을 다시 컴파일하고 캐시합니다.

이 설정이 해제되어 있으면 APC가 검사하지 않습니다. 일반적으로 APC가 파일을 다시 검사하도록하려면 웹 서버를 다시 시작하거나 캐시를 수동으로 지워야합니다. FastCGI 웹 서버 구성은 재시작시 캐시를 지우지 않을 수 있습니다. 스크립트 파일이 거의 변경되지 않는 프로덕션 서버에서는 비활성화 된 통계로 성능이 크게 향상 될 수 있습니다.


1

새로운 APC Admin 인터페이스에는 사용자 캐시 및 opcode 캐시를 추가 / 삭제하는 옵션이 있습니다. 흥미로운 기능 중 하나는 opCode 캐시에서 디렉토리를 추가 / 새로 고침 / 삭제하는 것입니다

APC 관리자 설명서

여기에 이미지 설명을 입력하십시오


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 및 심볼릭 링크에 문제가있었습니다. 파일 자체의 변경 사항을 무시하는 것 같습니다. 어떻게 든 파일 자체를 터치하는 것이 도움이되었습니다. 파일 수정과 터치의 차이점이 무엇인지 알 수 없지만 어떻게 든 필요했습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.