PHP 개발 기본 튜토리얼 ...LOGIN

PHP 개발 기본 튜토리얼 오류

1. 문제 소개

이전에 코드를 작성할 때 함수 이름이 잘못 쓰여 있고 세미콜론이 잊혀지는 것을 자주 보았습니다. . 함수를 재정의하면 다양한 오류가 보고됩니다.

개발 중에 오류를 표시하는 것은 개발에 매우 ​​유익합니다. 오류를 표시하면 오류를 빠르게 찾아 문제를 해결하는 데 도움이 되기 때문입니다.

제작 환경(예: 공용 네트워크)에서는 웹사이트, 마이크로사이트, 모바일 웹사이트, 모바일 인터페이스 등에 다른 사람이 액세스할 수 있습니다.

에러가 표시되면 노출되기 쉽습니다:

  • 서버의 파일 경로 및 파일 저장 사양

  • 어떤 사람들은 개인 이름을 사용하는 것을 좋아하고 소셜 엔지니어링을 통해 비밀번호를 역으로 추론할 수 있습니다

  • 때때로 mysql 데이터베이스 서버의 주소가 노출됩니다
    ... ...그리고 그래서

위의 정보는 특히 인터넷에서 은밀한 동기를 가진 사람들이 사용하기 쉽습니다.

예를 들어 다음 코드에서는 세미콜론을 추가하지 않고 서버측 파일 저장 경로, 프레임워크 정보 등을 완전히 노출합니다. 다음과 같습니다.

<?php
$fp = fopen('abc.txt','a+')
fwrite($fp,'abc');
fclose($fp);
?>

가 오류를 보고했습니다.

59.png

오류 메시지의 중국어 번역은 다음과 같습니다.
구문 분석 오류: 구문 오류입니다. 사고는 /home/vagrant/Code/Laravel/public/index.php 파일의 fwrite 5번째 줄 근처에서 발생했습니다.

이 장에서는 이 문제를 해결하려고 합니다


2. 표시 오류 억제

PHP에서 .ini 구성 파일. PHP의 오류 표시 상태를 제어할 수 있습니다.

php.ini에는 특별한 구성 항목이 있습니다:

display_errors

이 옵션은 오류 정보를 웹 페이지에 출력할지 또는 사용자는 표시하지 않고 숨깁니다.

이 값의 상태는 켜짐 또는 꺼짐이며, 값을 1 또는 0으로 설정할 수도 있습니다.

display_error 값을 0 또는 off로 설정하면 페이지에 오류가 표시되지 않습니다. 1 또는 on으로 설정하면 오류 메시지가 표시됩니다.

질문: 서버 php.ini를 수정할 수 있는 상태 권한이 없으면 어떻게 해야 하나요?

ini_set을 사용할 수 있습니다.

<?php
ini_set('display_errors' , 0 );
?>

위 코드는 php.ini의 display_errors 값을 수정하는 것과도 동일합니다. 그러나 현재 PHP 코드에서만 적용됩니다.

질문: php.ini의 구성 항목 상태를 얻으려면 어떻게 해야 합니까?

ini_get(매개변수 항목)을 사용하여 매개변수의 값을 가져올 수 있습니다.

예:

<?php
echo '服务器中display_errors的状态为' . ini_get('display_errors');
?>

참고: php.ini 파일을 수정한 후에는 서버를 다시 시작해야 합니다.


3. 오류 보고 수준

1.php 여러분 가장 일반적인 오류 표시:


60.png

위 유형 중:

오류는 가장 심각하므로 해결해야 합니다. 그렇지 않으면 프로그램을 계속 실행할 수 없습니다.
  • 경고도 매우 중요합니다. 통(Tong)도 해결해야 한다. 명확하고 의도적인 것이라면 굳이 다룰 필요가 없습니다.

  • 공지 무시하셔도 됩니다. 그러나 일부 회사에서는 프로젝트 표준이 특히 높습니다. 이는 또한 높은 표준 요구 사항을 가진 프로젝트에서도 해결되어야 합니다. 통지는 PHP의 실행 효율성에 영향을 미치기 때문입니다. 일반적으로 함수가 정의되지 않은 경우 등에 발생합니다. <… 🎜>

    위 확장을 토대로 이해해야 할 기타 오류 항목:

학습 과정에서는 위의 유형만 이해하세요. 기본적으로 발생하지 않기 때문에 발생하면 이 책이나 매뉴얼을 확인하여 알아볼 수 있습니다.


2.error_reporting 보고 오류 유형

61.pngerror_reporting은 오류 보고를 의미합니다. php.ini에도 이러한 매개변수가 있습니다. 이 매개변수. PHP 엔진이 기록, 보고 및 표시하는 오류 유형을 결정합니다.


1) php.ini에서 error_reporting 매개변수

를 설정하세요.

error_reporting 매개변수가 0으로 설정된 경우. 전체 PHP 엔진의 오류는 표시, 출력 또는 기록되지 않습니다. 다음 장에서 설명할 로깅에는 기록되지 않습니다.

모든 오류를 표시하려면 다음과 같이 작성할 수 있습니다.

error_reporting = E_ALL

모든 오류를 표시하고 프롬프트를 제외하려면 이 매개변수를 다음과 같이 작성할 수 있습니다. :

error_reporting = E_ALL & ~ E_NOTICE

모든 오류를 표시하지만 힌트, 호환성 및 향후 호환성은 제외합니다.

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

2) 어떤 경우에는 PHP를 작동할 권한이 없습니다. error_reporting을 제어하려면 어떻게 해야 합니까?

실행 중인 xxxx.php 파일 시작 부분에서 error_reporting() 함수를 사용하여 목표를 달성할 수 있습니다.

데모 코드는 다음과 같습니다.

<?php
//关闭了所有的错误显示
error_reporting(0);
//显示所有错误
//error_reporting(E_ALL);
//显示所有错误,但不显示提示
//error_reporting(E_ALL & ~ E_NOTICE);
?>

위 코드를 시도해보고 의도적으로 잘못된 코드를 작성해 볼 수도 있습니다. 지정된 오류가 현재 파일에 표시되는지 여부입니다.

[지식 포인트 확장 및 이해]: @ 기호는 이전에 배운 한 줄이므로 오류가 표시되지 않습니다. @ 기호를 사용하지 않거나 아껴서 사용하세요.

존재하지 않는 파일을 읽고 다음 PHP 코드로 구현 프로세스를 보여드리겠습니다.

<?php
//读取一个不存在的adsaf.txt文件,用@符抑制错误
@$fp = fopen('adsaf.txt','r');
?>
@符效率较低,它在php内核中的实现过程是:
<?php
//关闭错误
error_reporting(0);
 
//读取一个不存在的文件,显示错误
 
//显示错误
error_reporting(E_ALL & ~ E_NOTICE);
?>

4. 오류 기록 로그

일부 회사에는 특별한 로그 수집 시스템이 있습니다. 로그 수집 시스템은 뒤에서 오류, 경고 및 프롬프트를 수집하는 데 자동으로 도움을 줍니다.

전용 로그 수집 시스템이 없고 서버에서 실행 중인 로그를 파일을 통해 수집하는 회사도 있습니다.


그 중 PHP 오류 및 경고를 수집해야 합니다.

그러면 질문이 생깁니다. 오류 보고 수준이 사용자가 보기 훨씬 전에 설정되어 있다면 오류를 로그 시스템에 어떻게 수집할 것인가? php.ini에서 사용해야 하는 관련 구성 항목은 다음과 같습니다. 이 두 가지 구성 항목은 다음과 같습니다.

62.png


설명:

  • 테이블의 log_errors 및 log_errors_max_len은 매우 이해하기 쉽습니다.

  • 그리고 error_log는 오류가 저장될 경로를 지정합니다. 구성 항목의 syslog는 다소 이해하기 어려울 수 있습니다. syslog는 시스템 기록을 나타냅니다. Windows 시스템은 컴퓨터의 로그 수집기에 있습니다. Linux 기본값: /etc/syslog.conf

[확장] 지식 포인트에 대해 알아보세요. Linux 시스템이 시작되거나 로그 수집이 수정되는 경우. 타사 전용 로그 수집 서버에 저장될 수 있습니다.

또한 PHP는 우리를 위해 특별히 사용자 정의 오류 로그 기능을 준비했습니다.

bool error_log ( string $error message[, int $error message type = 0 [, string $storage Target ]] )

이 함수는 오류 정보를 웹 서버의 오류 로그나 파일로 보낼 수 있습니다.

일반적으로 사용되는 오류 메시지 유형:


63.png


예:

<?php
//无法连接到数据库服务器,直接记录到php.ini 中的error_log指定位置
error_log("无法连接到数据库服务器服务器");
//可以发送邮件,但是php.ini必须配置过邮件系统
error_log('可以用邮件报告错误,让运维人员半夜起床干活',1 ,'liwenkai@phpxy.com');
//记录在指定的位置
error_log("我是一个错误哟", 3, "d:/test/my-errors.log");
?>

참고:
error_log에서 이메일을 보내는 것은 초보자에게 생소할 수 있으므로 지식을 습득할 필요는 없습니다.




5. 사용자 정의 오류 처리 기능

이 지식의 출발점은 조금 높습니다. 대부분의 사람들은 소프트웨어 엔지니어링이나 사용자 정의 오류 처리에 대한 경험이 없으며 사용 시나리오를 상상하기 어렵습니다. 이 학습 블록을 건너뛰고 싶다면 그렇게 할 수 있으며 우리는 이를 지원합니다.

이 지식 포인트에는 실제 적용 시나리오가 많지 않습니다. 자신만의 프레임워크 작성을 시작할 계획이 있거나 이 책의 첫 번째 프로젝트를 완료한 경우.

사용자 정의 오류에 일반적으로 사용되는 두 가지 함수:

set_error_handler(호출 가능한 $callback 오류 처리 함수)
사용자 정의 오류 처리 함수 설정

trigger_error(문자열 $error_msg)
사용자 수준 오류/경고/알림 메시지 생성

<?php
//定义一个自定义的错误处理函数
function customError($errno, $errstr, $errfile, $errline) {
    //输出错误消息
    echo "<b>Custom error:</b> [$errno] $errstr<br />";
    //输出错误文件和错误行
    echo "Error on line $errline in $errfile<br />";
    echo "Ending Script";
    //中止程序运行
    exit;
}
//使用set_error_handler 绑定用户自定义函数
set_error_handler("customError");
$test=2;
//触发自定义错误
if ($test > 1) {
    trigger_error("A custom error has been triggered");
}
?>


다음 섹션
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php.cn</title> </head> <body> <?php echo "Hello World!!!"; ?> </body> </html>
코스웨어