2009-05-12 2 views
3

opcode 캐시로 APC를 사용하고 있습니다. APC에 파일이 존재하지 않는 것을 캐시 할 수있는 방법이 있습니까? apc.stat = 0apc.include_once_override = 1을 설정했습니다. 파일 시스템에 없을 수도있는 파일에 include_once을 호출하는 성능을 향상시키기 위해 할 일이 더 있습니까? 그것이 존재한다면 분명히 우리는 그것을 포함시키고 자한다. 그러나 존재하지 않는다면 은 결코 존재하지 않으며이 존재할 것이고 PHP가 확인을 요청할 때마다 파일에 open()을 호출하는 것을 원하지 않을 것입니다.APC 및 누락 된 파일의 opcode 캐싱

몇 가지 배경에 대해 : 우리는 하나의 기본 사이트를 가지고 있지만 고객별로 고객 사이트별로 사용자 정의를 제공합니다. 일부 고객은 사용자 정의 로그인 페이지가 있고 다른 페이지는 완전히 고유 한 페이지가 있습니다.

우리는 필요에 따라 컨트롤러를 무시할 수있는 약간 특별한 방법으로 Zend Framework를 사용하고 있습니다. 우리 사이트에는 LoginController이라는 컨트롤러가 파일 controllers/LoginController.php에 정의되어있을 수 있습니다. 그러나 고객 "Company"는 사용자 정의 로그인 페이지에 대한 요구 사항을 가질 수 있으므로 Company_LoginController이라는 새 클래스를 디렉토리 controllers/company/LoginController.php에 정의하여 작성합니다. 파일이있는 경우

include_once APPLICATION_PATH . '/controllers/company/LoginController.php'; 
if (class_exists("Company_LoginController")) { 
    echo 'customer-specific controller exists'; 
} else { 
    include_once APPLICATION_PATH . '/controllers/LoginController.php'; 
    echo 'customer-specific controller does not exist; using default'; 
} 

: (.이 명명 규칙은 우리가 "모듈"의 젠드 프레임 워크의 개념과 일치 할 수 있습니다)

우리가 클래스를 처리 할 때, 우리는 기본적으로 같은 것을 할 /controllers/company/LoginController.php이 있으면 APC는 첫 번째 요청에서이를 캐시에 저장하고 파일 시스템에서 다시 가져 오지 않습니다. 그러나 /controllers/company/LoginController.php 파일이 이 아니고이 아닌 경우 APC에서이 파일의 존재를 두 번 이상 확인하지 않으려합니다. 이런 일이 일어날 수있는 방법은 없나요?

답변

3

회사 디렉토리에 빈 파일을 만들 수 있습니까? APC는이 파일을 두 번로드하지 않으므로 서버를 처음 시작할 때 "로드"되는 빈 파일이 있으면 아무런 해가 없습니다.

+0

하면 .. 그 도움이 그럼에도 불구하고 희망 (또는 아마도 간단한 포함), 임시 파일을 삭제하십시오. 그러나 그것은 약간의 해킹 일 것입니다. –

+0

아, 이것은 생각하지 못했던 자세입니다 (파일을 생성 한 후 다시 삭제하는 등). 해킹 비트이기 때문에 다른 devs에서 얼마나 잘 처리되는지 확신하지 못합니다. –

+0

빈 파일을 전송한다는 생각은 잘못되었습니다. 그러나 즉시 파일을 만드는 모든 솔루션에는 더 많은 코드가 포함됩니다.이 코드는 file_exists()에 대한 호출을 포함하며 APC를 사용하는 것이 이러한 호출을 피하는 것이라고 가정합니다. 또한 clearstatcache (해당 캐시를 사용하는지 APC가 사용하는지 여부는 알 수 없음)에 대한 호출이있을 수 있습니다. – jmucchiello

2

jmucchiello의 대답은 단순함을 이유로 내 표를 얻지 만, 어떤 이유로 그것이 실용적이지 않은 경우 항상 어려운 일을 할 수 있습니다.

다음은 거친, 검증되지 않은 예입니다,하지만 당신은 젠드 프레임 워크를 사용하는 경우

function conditional_include($file) { 
    $key = 'file-exists-' . $file; 
    //fetch cache key; if it does not exist, then... 
    if(($fileExists = apc_fetch($key)) === false) { 
    //actually hit the disk to look for the file, and store the result 
    apc_store($key, $fileExists = (file_exists($file) ? 1 : 0)); 
    } 

    //only include the file if it exists. 
    if($fileExists) 
    include_once $file; 
} 
0

내가 추천 할 것입니다 수동으로 자신에게 APC에서 파일의 존재를 저장하는 기본적인 아이디어를 의사 소통해야한다 Zend_Loader 자동로드 마법을 사용하여 필요한 파일이로드되었는지 확인하십시오. 오토로더를 사용하면 ZF에서 거의 모든 include_once 호출을 제거 할 수 있습니다 (Zend_Loader 클래스의 include_once 호출 제외) 경고 - 클래스 및 파일 이름 스타일에 따라 다르지만 자동 로더를 다시 작성/확장하여이 문제를 해결할 수 있습니다.

당신이 후에 무엇되지 않을 수도 있습니다하지만 난 apc_compile_file와 힘 컴파일, 당신은 잠재적으로 일시적으로 빈 파일을 바람직하지 않은 만들 수 있습니다 주위에 빈 파일을 떠나, 어떤 이유로,