2009-10-23 3 views
1

메시지를 파일에 기록하는 로깅 도구를 작성 중이며 파일 포인터를 처리하는 가장 좋은 방법이 확실치 않습니다. 나는이 두 가지 방법 사이에 던지기 해요 :PHP에서 파일 핸들을 여는 데 필요한 간접비가 있습니까?

// Open, Write, Close; Open, Write, Close... 
function write($message) { 
    $fh = fopen('file.log', 'a'); 
    fwrite($fh, $message . "\n"); 
    fclose($fh); 
} 

// OR ----- 

// Open, Write, Write, Write..., Close 
function __construct() { 
    $this->fh = fopen('file.log', 'a'); 
} 
function __destruct() { 
    fclose($this->fh); 
} 
function write($message) { 
    fwrite($fh, $message . "\n"); 
} 

내가이 클래스가로드 및 모든 페이지에 건설하지만, 가장 가능성이있을 것입니다하지만 반드시, 사용하지 될 것이라고 상상한다.

두 가지 방법의 성능, 보안 또는 기타 함정이 있으며 권장 할만한 방법이 있습니까?

+0

왜 아파치 로그를 사용하지 않는가? error_log() etc. – cletus

+1

그래, 좋은 지적을 만들지 만 질문은 여전히 ​​남아 있니? – nickf

답변

2

숫자를 줄 수는 없지만 파일을 여는 것만으로 파일을 열었다가 반복해서 열면 비용이 많이 듭니다. 그리고 저는 PHP가 아닌 OS 레벨에서 이야기하고 있습니다. open() (또는 Windows 사용자는 CreateFile())을 커널로 호출하고, 파일 시스템의 엔티티에 경로 문자열을 일치시키고, 디스크에서 디렉토리 구조를 읽은 다음 다른 시스템 호출로 핸들을 닫습니다. 특히이 수가 많으면 이 모든 일을 너무 많이하지 않도록하십시오. 또는 측정 결과가 정상인지 확인하십시오.

절대로 사용하지 않을 것으로 예상되는 비용에 대해 염려가된다면이 두 가지 방법을 혼용 해 보았습니까? 즉, 파일이 이미 열려 있지 않은 경우 write on open을 수행합니다. 그렇지 않으면 이전 핸들을 다시 사용합니다.

+0

당신은 싱글 톤을 의미합니다. – lemon

+4

"토마토라고 말하면 ...."나는 패턴을 알고 있지만 실제로 기술을 설명하는 것보다 전문 용어를 선호하는 유형은 아닙니다. :-) – asveikau

1

로깅하는 내용에 따라 다릅니다.

정말 두 번째 버전이 가장 좋습니다. 다음과 같이 생각하십시오.

요청한주기 동안 발생한 오류를 기록하려고합니다. 요청하는 동안 3 개의 오류가 발생했다고 가정 해 보겠습니다. 첫 번째 방법을 사용하는 경우 파일을 3 번 열고 열고 닫으면 오버 헤드가 증가합니다. 로거 클래스의 동일한 인스턴스를 사용하는 경우 파일을 한 번만 열고 요청 중에 3 줄을 작성합니다.

이렇게하면 문제가 해결되기를 바랍니다.

선택적으로 파일 포인터를 첫 번째 메서드에 전달하고이 메서드로 쓰기 작업 만 수행 할 수 있습니다. 적어도 다음

function log($message) { 
    global $_log; 
    if (!defined(LOG_OPEN)) { 
    define(LOG_OPEN, true); 
    $_log = fopen('filename.log', 'w'); 
    register_shutdown_function('close_log'); 
    } 
    fwrite($_log, $message . "\n"); 
} 

function close_log() { 
    global $_log; 
    fclose($_log); 
} 

당신이 메시지를 쓸 때 당신은 단지 로그를 개방하고 있습니다 :

1

여기에 다른 버전입니다.

비용이들 것입니다. 네트워크 대기 시간 비용 및 기타 등등의 웅장한 계획에서, 많은 파일을 열지 않으면 중요 할 것입니다. 나는이 기록이 그 효과에서 측정 가능할 지조차 의심 스럽다.

+1

이것은 좋은 것처럼 보입니다.전역 변수 대신 정적 변수를 사용하여 캡슐화에 도움을 주겠지 만 shutdown 함수를 사용하여 로그를 호출하여 파일을 닫는 추가 매개 변수가 있는지 확인하십시오. –

1

두 번째 방법은 분명히 IMO입니다. 파일 핸들을 열거 나 닫을 때 비용이 들지만 상대적으로 사소한 편이지만 응용 프로그램 내에서 이렇게 많은 작업을 수행하면 상당히 많은 작업이 추가됩니다 (비록 매우 드문 것이지만 효과가 없을지라도). 나는 생각하지 않는다). 추가 설정 또는 정리 기능을 추가해야하는 경우 두 번째 방법이 가장 적합합니다. __construct/__destruct 메서드에 코드를 추가하기 만하면됩니다.

관련 문제