문제

저는 몇 가지 기본 사항에 대해 잘 알고 있지만, 특히 라이브 사이트나 웹 앱에서 PHP에서 오류 처리(예외 발생 포함)를 사용해야 하는 시기와 이유에 대해 더 알고 싶습니다.남용될 수 있는 것인가요? 그렇다면 남용은 어떤 모습인가요?사용하면 안되는 경우도 있나요?또한 오류 처리와 관련하여 일반적인 보안 문제는 무엇입니까?

도움이 되었습니까?

해결책

이미 말한 내용에 추가해야 할 한 가지는 웹 애플리케이션의 오류를 로그에 기록하는 것이 가장 중요하다는 것입니다. 이런 식으로 Jeff "Coding Horror"Atwood가 제안한 것처럼 사용자가 앱에 문제가 발생하는시기 ( "잘못된 내용을 묻는 대신")를 알게 될 것입니다.

이렇게하려면 다음 유형의 인프라를 권장합니다.

  • 데이터베이스에서 "충돌"테이블을 작성하고보고 오류를위한 래퍼 클래스 세트를 만듭니다. 충돌에 대한 범주를 설정하는 것이 좋습니다 ( "차단", "보안", "PHP 오류/경고"(vs Exception) 등).
  • 모든 오류 처리 코드에서 오류를 기록하십시오. 이 작업은 API (위의 단계)를 얼마나 잘 구축했는지에 따라 일관되게 달라야합니다. 하찮은 제대로 충족되면 충돌을 기록합니다.

추가 크레딧 : 때로는 충돌이 데이터베이스 수준 충돌이기도합니다 : 즉 DB 서버 다운 등.이 경우 오류 로깅 인프라 (위) 오류 로그가 실패합니다 (로그가 시도하여 DB에 충돌을 기록 할 수 없습니다. DB에 편지). 이 경우 충돌 래퍼 클래스에 Failover Logic을 작성합니다.

  • 관리자에게 이메일을 보내거나/또는
  • 충돌의 세부 사항을 일반 텍스트 파일에 기록하십시오.

이 모든 것은 과잉처럼 들리지만, 나를 믿으십시오. 이것은 당신의 응용 프로그램이 "안정적인"또는 "플라키"로 받아 들여지는지에 차이를 만듭니다. 이러한 차이는 모든 앱이 항상 벗겨 지거나 충돌하는 것으로 시작되지만 앱의 모든 문제에 대해 알고있는 개발자는 실제로이를 해결할 수있는 기회가 있습니다.

다른 팁

대략적으로 말하면, 오류는 PHP의 유산인 반면, 예외는 오류를 처리하는 현대적인 방법입니다.가장 간단한 방법은 예외를 발생시키는 오류 처리기를 설정하는 것입니다.이렇게 하면 모든 오류가 예외로 변환되고, 그러면 하나의 오류 처리 방식으로 간단하게 처리할 수 있습니다.다음 코드는 오류를 예외로 변환합니다.

function exceptions_error_handler($severity, $message, $filename, $lineno) {
  if (error_reporting() == 0) {
    return;
  }
  if (error_reporting() & $severity) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
  }
}
set_error_handler('exceptions_error_handler');
error_reporting(E_ALL ^ E_STRICT);

하지만 코드가 오류와 함께 작동하도록 특별히 설계된 몇 가지 경우가 있습니다.예를 들어, schemaValidate 의 방법 DomDocument 문서의 유효성을 검사할 때 경고가 발생합니다.오류를 예외로 변환하면 첫 번째 실패 후 유효성 검사가 중지됩니다.때로는 이것이 당신이 원하는 것일 수도 있지만, 문서의 유효성을 검사할 때 실제로는 모두 실패.이 경우 오류를 수집하는 오류 처리기를 임시로 설치할 수 있습니다.다음은 해당 목적으로 사용한 작은 조각입니다.

class errorhandler_LoggingCaller {
  protected $errors = array();
  function call($callback, $arguments = array()) {
    set_error_handler(array($this, "onError"));
    $orig_error_reporting = error_reporting(E_ALL);
    try {
      $result = call_user_func_array($callback, $arguments);
    } catch (Exception $ex) {
      restore_error_handler();
      error_reporting($orig_error_reporting);
      throw $ex;
    }
    restore_error_handler();
    error_reporting($orig_error_reporting);
    return $result;
  }
  function onError($severity, $message, $file = null, $line = null) {
    $this->errors[] = $message;
  }
  function getErrors() {
    return $this->errors;
  }
  function hasErrors() {
    return count($this->errors) > 0;
  }
}

그리고 사용 사례는 다음과 같습니다.

$doc = new DomDocument();
$doc->load($xml_filename);
$validation = new errorhandler_LoggingCaller();
$validation->call(
  array($doc, 'schemaValidate'),
  array($xsd_filename));
if ($validation->hasErrors()) {
  var_dump($validation->getErrors());
}

처리되지 않은 오류는 스크립트를 중지합니다. 그것만으로도 오류를 처리할 수 있는 좋은 이유가 됩니다.

일반적으로 Try-Catch 블록을 사용하여 오류를 처리할 수 있습니다.

try
{
    // Code that may error
}
catch (Exception $e)
{
    // Do other stuff if there's an error
}

페이지에 나타나는 오류나 경고 메시지를 중지하려면 다음과 같이 호출 앞에 @ 기호를 붙일 수 있습니다.

 @mysql_query($query);

그러나 쿼리를 사용하면 일반적으로 무슨 일이 일어나고 있는지 더 잘 알 수 있도록 이와 같은 작업을 수행하는 것이 좋습니다.

@mysql_query($query)
    or die('Invalid query: ' . mysql_error() . '<br />Line: ' . __LINE__ . '<br />File: ' . __FILE__ . '<br /><br />');

스크립트가 작업중인 데이터를 명시 적으로 제어 할 수없는 경우 오류 처리를 사용해야합니다. 예를 들어 양식 검증과 같은 장소에서 자주 사용하는 경향이 있습니다. 코드에서 오류가 발생하기 쉬운 장소를 발견하는 방법을 아는 것은 약간의 연습이 필요합니다. 일부 일반적인 것은 값을 반환하는 기능 호출 후 또는 데이터베이스 쿼리의 결과를 처리 할 때입니다. 함수에서의 수익이 당신의 기대가 될 것이라고 가정해서는 안되며, 기대에 따라 코딩해야합니다. 시도/캐치 블록을 사용할 필요는 없지만 유용합니다. 간단한 if/else 체크로 많은 시간을 할 수 있습니다.

스크립트가 단순히 충돌하지 않는 많은 "오류"가 있기 때문에 오류 처리는 안전한 코딩 사례와 함께 진행됩니다. 오류 처리 자체에 대해 엄격하게는 아니지만 Bdytes는 찾을 수있는 보안 PHP 프로그래밍의 일부 기본 사항에 대한 좋은 4 기사 시리즈를 가지고 있습니다. 여기. 여기에 STACKOVERFLOW에 대한 다른 많은 질문이 있습니다. mysql_real_escape_string 그리고 정규 표현 사용자가 입력 한 데이터의 내용을 확인하는 데 매우 강력 할 수 있습니다.

모범 사례 IMHO는 다음 접근 방식을 사용하는 것입니다. 1. 오류/예외 처리기 생성 2. 앱 시작시 시작 3. 내부에서 모든 오류를 처리하십시오.

<?php

클래스 디버그 {

    public static setAsErrorHandler() {
         set_error_handler(array(__CLASS__, '__error_handler'));
    }

public static function __error_handler($errcode, $errmsg, $errfile, $errline) {
       if (IN DEV) {
                print on screen
           }
           else if (IN PRO) {
                log and mail
           } 
    }

}

디버그 :: setAserRorHandler ();

?>

mysql_error를 출력하는 대신 로그에 저장할 수 있습니다. 이렇게하면 오류를 추적 할 수 있으며 (사용자가보고 할 사용자에게 의존하지 않음) 들어가서 문제를 제거 할 수 있습니다.

가장 좋은 오류 처리는 사용자에게 투명한 종류이며, 코드가 문제를 해결하도록하고 해당 사용자 동료를 포함 할 필요가 없습니다.

코드에서 즉시 오류를 처리하는 것 외에도

http://us.php.net/manual/en/function.set-exception handler.php
그리고
http://us.php.net/manual/en/function.set-error handler.php

자신의 예외 핸들러를 특히 유용하게 설정합니다. 예외가 발생하면 예외 유형에 따라 다른 작업을 수행 할 수 있습니다.

예 : 언제 a mysql_connet 전화 반품 FALSE 나는 a new DBConnectionException(mysql_error()) "특별한"방법을 처리합니다 : 오류, DB 연결 정보 (호스트, 사용자 이름, 비밀번호) 등을 기록하고 DB 팀에게 DB에 문제가있을 수 있음을 알리는 데 이메일을 보내도록 할 수도 있습니다.

나는 이것을 사용하여 표준 오류 처리를 칭찬합니다. 나는이 접근법을 과도하게 사용하지 않을 것입니다

@의 오류 억제는 매우 느립니다.

또한 데이터베이스 또는 공개적으로 액세스 가능한 서버를 유지하지 않고도 Google 양식을 사용하여 예외를 잡고 분석 할 수도 있습니다. 튜토리얼이 있습니다 여기 그것은 프로세스를 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top