2013-07-24 2 views
1

하나의 PHP 파일 만 가질 수 있습니다.하나의 파일에서 동적 클래스 정의

출력을 생성하기 위해 특정 경우에만 클래스를 정의해야합니다. 이 같은

뭔가 :이 코드

if (date("j") == "1") { 
    echo "Not today"; 
    exit; 
} 

new OutputGenerator(); 

class OutputGenerator { 
    // very large definition (~3500 lines) 
} 

문제는 PHP가 전체 파일을 처리하고 그 스크립트가 매우 느리게 만드는 것입니다. 클래스 선언이 없으면 초당 ~ 500 건의 요청을 처리 할 수 ​​있습니다. 정의를 사용하면 (정의되기 전에 종료하더라도) 나는 50 % 만 얻으며 이는 90 %의 성능 저하입니다.

조건부로 선언문과 함께 외부 파일을 요구하면 내 문제가 해결되지만이 파일 내에 있어야합니다.

이렇게하려면 (eval()을 사용하거나 정의가있는 외부 파일이 필요합니다) 방법이 있습니까?

+1

파일의 나머지 부분에 'else' 문을 사용하면 도움이됩니까? – kalley

+1

성능 저하의 원인이되는 구성이 아니라 클래스 정의인지 확인할 수 있습니까? –

+0

큰 문제는 클래스의 인스턴스화가 아무 것도 지정하지 않았기 때문에 모든 것이 생성자에서 수행되고 있으며 모든 매개 변수가 모든 항목에 대해 전역 변수를 사용하고 있기 때문에 중요하지 않습니다. – Orangepill

답변

1

PHP 파일의 구문 분석 시간이 길어서는 안됩니다. 문제는 OutputGenerator의 생성자가 값 비싼 작업을 수행하고 있다는 것입니다.

이 비용을 피하기 위해 OutputGenerator의 인스턴스를 조건부로 만들 수 있습니다.

if($iNeedAnOutputGenerator){ 
     $og = new OutputGenerator(); 
} 
+0

클래스 내의 작업은 문제가되지 않습니다. 클래스를 호출하거나 인스턴스화하지 않더라도 발생합니다. –

+0

다음 조건부 포함하는 유일한 방법은 ... 당신이 문자열에서 정의를 가지고 조건부로 그것을 평가하는 것 같은 미친 짓을하고 싶지 않다면 ...하지만 그것은 광기입니다 – Orangepill

+0

나는 그것에 3500 loc 클래스 정의로 생각합니다. 솔루션을 재평가해야합니다. 거기에 저축이 있습니다. – Orangepill

0

스크립트가 너무 극도로 적기 때문에 성능이 크게 떨어질 수 있다는 생각에 사십시오. 당신이하는 일은 자원 집약적 인 일이 아니므로, 큰 클래스 정의가이 경우에 눈에 띄는 차이를 보여줄 수 있다는 것을 알 수 있습니다.

구문 분석이 인 경우 가장 명확한 대답은 이며 opcode 캐시를 사용하는 것입니다. PHP 5.5부터이 함수가 내장되어 있지만, PHP 버전 이전에는 APC extension을 사용해야합니다.

비록 APC가 없어도 간단한 스크립트에 대한 초당 요청 수가 50 개라고 생각합니다. 어딘가에 완전히 다른 병목 현상이 발생할 수 있습니다.

관련 문제