2009-11-10 2 views
1

전자 상거래 체크 아웃 페이지 인 프로덕션 환경에서 과거에 스크립트가 작동하지 않아서 비용이 많이 들었습니다. 내가이 일했다, 그래서 나는 오류에 대한 알림을 받게하고 싶었 :커스텀 에러 핸들러를 설정하면 스크립트 실행 시간이 급격히 늘어납니다.

<?php 
function mailErrorHandler($errno, $errstr) 
    { 
    echo "<!--PHP ERROR:"; 
    echo "---[$errno] $errstr ---"; 
    echo "-->"; 
    error_log("Error: [$errno] $errstr",1, 
    "[email protected]","From: [email protected]"); 
    } 

set_error_handler("mailErrorHandler",E_ALL); 

echo 1-thisisnotanumber; 

?> 

그 자체가 스크립트에 그대로 내가 그것을 사용하는 경우, 작동하고 신속하게 실행합니다. 그러나 기존 응용 프로그램에 추가하면 페이지로드 시간이 1 초당 <이 아닌 극적으로 40 초 감소합니다. 아무도 이것이 일어날 수있는 이유를 생각할 수 있습니까?

+0

귀하의 응용 프로그램은 몇백 가지의 고지 레벨 오류를 분출합니까? 그렇다면 솔루션은 간단합니다. 엉성한 코드를 정리하십시오. –

답변

1

많은 양의 트래픽이 발생하고 많은 오류가 발생하는 경우 로그에 쓰면 상당한 양의 디스크 IO가 발생할 수 있습니다. 이렇게하면 앱의 속도가 느려질 수 있습니다.

어쩌면 당신이 던지려는 것은 오류가 아니라 오히려 많은 "예외"통지입니다. 표시되지 않도록 설정 한 경우 (대부분의 PHP 버전에서 기본값) 보트로드가 발생하면 수백 및 수 백 번의 오류 처리기를 실행할 수 있습니다. 처리기가 실행될 때마다 추적을 수행하고 현재 범위를 벗어나 모든 종류의 처리를 수행해야하며 PHP 5.3에서 =& new을 사용 중이거나 정의되지 않은 배열 요소 (또는 다른 일반적인 공지 사항), 당신은 그러한 종류의 지연을 보게 될 것입니다.

그래서이 문제를 해결하기 위해 의사는 테스트 서버에서 오류 처리기를 끄고주의 표시를 켜고 흐름을 실행하고 오류 /주의 사항/등을 적어 둔 다음 앞에서 설명한 내용을 수정하도록 규정합니다 귀하의 생산 상자에 통지.

희망이 도움이됩니다.

+0

모든 pageload가 10 개의 오류를 일으키고 각각에 대해 error_handler가 전자 메일을 보내야하는 경우 동의합니다. 40 '초 지연은 송신 문제 일 수 있습니다. 모든 오류를 추적하기 위해 smtp 서버 또는 내 조언을 편집하고 오류 처리기를 편집하십시오. 단, 스크립트 끝 부분에는 전자 메일 1 개만 보내주십시오. – Strae

0

흠. "스스로 사용하라"고 말할 때, 아파치를 통해 호출되는 별도의 페이지를 의미합니까, 아니면 명령 행에서 실행하고 있습니까? 이메일 사용과 결합 된 지연으로 인해 DNS 또는 네트워크 문제가 의심 스럽거나 ... 해결되지 않거나 연결되지 않고 시간이 초과 된 것입니다.

또 다른 생각은 ... Xdebug를 실행하고 이것이 실행되는 동안 프로파일 덤프를 실행하여 항상 걸리는 부분에 어떤 빛이 있는지 확인하십시오.

+0

내 뜻은 위의 코드를 자신의 PHP 파일에 저장하고 웹 브라우저에서 액세스하면 스크립트 실행 시간이 위의 코드를 포함 할 때 실제 응용 프로그램에 추가 된 시간보다 현저히 짧아집니다. –

0

error_log() 호출 후 exit()을 추가하십시오.

0

타 솔루션 당신이 error_hander에 문제가있는 경우 파일에 기록하는 것입니다 :

설정 php.ini 파일에서

log_errors = On 
html_errors = Off 
error_log = log 

을, 모든 오류는 기본으로 기록됩니다 서버의 error.log.

관련 문제