2014-04-19 3 views
1

PHP 사이트의 모든 웹 페이지에서 사용할 수 있어야하는 ~ 100 개의 문자열 변수가 있습니다. 데이터는 런타임에 절대로 바뀌지 않지만 앞으로는 여러 세트의 데이터가 필요하며 페이지 요청에 사용되는 데이터간에 전환해야합니다. 문자열의 길이는 5에서 600 자까지 다양합니다. 현재 다음과 같은 데이터가 포함 된 파일을 포함하고 있습니다.opcache로 PHP에서 정적 데이터 캐싱

$someStuff = "abc"; 
$otherStuff = "def"; 
// etc 

저는 opcache를 사용하고 있습니다. 이 접근 방식은 opcache의 이점이 얼마나됩니까?

나는 this answer을 보았습니다. 캐싱 이점이 주요 조회를 수행하는 데 가치가있는 경우 연관 배열을 사용하도록 변경할 수 있습니다. 그러나 정적 배열 필드가있는 클래스를 사용하는 것이 변수를 선언하는 것보다 내 상황에 더 적합한 지 여부는 확실하지 않습니다.

고정 변수가있는 함수가 좋은 생각일까요? 정적 클래스 필드와 같거나 더 좋거나 나쁠까요?

function getItem ($name) { 
    static $items = array("someStuff" => "abc"); 
    return $items[$name]; 
} 

각 문자열의 변수 대신 함수일까요? 모든 문자열이 주어진 페이지에 사용되는 것이 아니라면 더 좋을까요? (종종 그렇습니다)?

function someStuff() { return "abc"; } 
function otherStuff() { return "def"; } 

최상의 해결책은 무엇입니까?

$someStuff = "abc"; 
$otherStuff = "def"; 
// ... 

: 나는 가능한 한 효율적으로 디스크/데이터베이스에서 읽기 피하기 위해 같은 것 때문에 데이터가 모든 페이지에 필요 등 실제로

답변

2

은 당신이 그런 짓을하는지 여부 차이가 없습니다 또는

$constants = array(
    'someStuff' => "abc"; 
    'otherStuff' = >"def"; 
    // ... 
); 

또는이 값을 다른 답변에 따라 클래스의 정적 배열로 래핑하십시오. OPcache를 사용하면 컴파일 오버 헤드와 디스크 I/O 오버 헤드가 제거됩니다. 문자열 상수를 인턴드하여 젠드 엔진에서 정적으로 사용할 수있게합니다. 클래스 버전은 배열 구조체의 하나의 얕은 복사본을 수행하고 다른 두 버전은 약 ~ 100 개의 변수를 초기화하는 ~ 200 개의 opcode exec를 수행하며 실제 내부 문자열은 참조로 효과적으로 복사됩니다. 엔진은 일반적으로 초 당 20-40M opcode exec를 해석하므로 수학은 중요합니다.

내 권장 사항은 다음과 같습니다. 런타임 문제를 걱정하지 마십시오. 가장 명확하고 유지 관리가 쉬운 방식을 선택하십시오. 개인적으로, 나는 자신의 config 클래스 파일에서 자동로드 된 클래스를 사용할 것이지만 이것은 당신의 어플리케이션이며 가장 명확한 것입니다.

현재 함수를 사용하는 것은 지저분하고 런타임 비용이 들며 함수 호출은 가장 비싼 PHP 작업 중 하나입니다. 클래스 상수에 대한 참조는 상당히 저렴하지만 이러한 벤치마킹을 시도하십시오. 그러나 요청 당이 10k + 시간을 언급하지 않는 한 다시 중요한 차이를 느끼지 않을 것입니다. 너무 똑똑하다면 너는 결국 "발에 총격을 내야 만한다." :-)

+0

설명해 주셔서 감사합니다. 걱정하기에는 시기상조라고 생각했지만, 각 페이지에 있기 때문에 자신을 멈추기가 어려웠습니다. 나는 클래스와 정적 필드로 갔다. 건배! – NateS

+1

BTW, 진정한 상수라면 [PHP Class Constants] (http://www.php.net/manual/en/language.oop5.constants.php)에서 읽어보십시오. – TerryE

+0

그들은 실제로입니다. 몇 가지 정규식을 소스로 대체하여 클래스 상수로 전환했습니다. opcache와 클래스 상수를 사용할 때 어떤 오버 헤드가 있습니까?마이크로 벤치 마크가 잘못된 것을 측정 할 수 있거나 페이지로드 당 오버 헤드를 측정하기가 어려울 수 있습니다. 게다가, 그것은 단지 내 호기심을 만족시키기위한 것입니다. :) – NateS