php8 에서 에러발생시 or die() 로 가지 않고 http 500 에러로 종료됩니다.

php8 에서 에러발생시 or die() 로 가지 않고 http 500 에러로 종료됩니다.

QA

php8 에서 에러발생시 or die() 로 가지 않고 http 500 에러로 종료됩니다.

본문

항상 도움은 주지도 못하면서 질문만 해서 죄송하네요.

 

카페24 호스팅을 새로 신청했습니다.
전에 카페24의 php 버전 7.3.1 에서는 문제가 없었던 코드가 이번 8.2.7 에서 이상하게 작동합니다.
특히 mysqli_ 함수를 사용할 때인데, 예를들어...

 

$conn = mysqli_connect(HOST, USER, PW, DB) or die("에러발생: ".mysqli_error($conn));

 

위 코드에서 정상적으로 접속되면 문제없는데 접속이 실패하면..

에러발생: Fatal error : ......

 

이런식으로 종료되어야 하는데 die()는 무시되고 그 전에 mysqli_connect(...) 단계에서 스크립트가 끝나면서 HTTP 500 에러가 발생합니다.
mysqli_connect 뿐만 아니라 mysqli_query 역시 마찬가지 입니다.

구글에서 검색해 보니 스크립트 맨앞에...

 

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(E_ERROR | E_PARSE);
ini_set("display_errors",1);

 

위 내용을 넣으니 에러가 출력되기는 하는데..질문의 요점은..
여기서도 역시 die() 까지 가지는 않고 mysqli_connect() 단계에서 sql 에러만 출력하고 끝납니다.
어떻게 해야 or die("에러발생: ".mysqli_error($conn)); 까지 가서 "에러발생: Fatal error....." 이렇게 나오게 할 수 없나요?
그렇지 않으면 기존 소스를 수정해야 할 부분이 너무 많아서...ㅠ

 

참고로 똑같은 소스인데 php 7.3.1 카페24 호스팅에서는 문제 없습니다.
소스는 다음과 같습니다.


<?php
$host = "localhost";
$user = "xxx"; // 에러 나오게 일부러 아이디,비번,db 틀리게 함
$pw = "yyy"; 
$db = "zzz";
$conn = mysqli_connect($host, $user, $pw, $db) or die("에러발생: ".mysqli_error($conn));
?>

이 질문에 댓글 쓰기 :

답변 6

수정해봤습니다.


$conn = null;
try {
  $conn = new mysqli($host, $user, $pw, $db);
  $conn->set_charset("utf8");
} catch (Exception $e) {
  error_log($e->getMessage());
}
 
if ($conn && $conn->connect_errno) {
  error_log("Error connect to DB: " . $conn->connect_error);
}
if ($conn) {
  // 어쩌구 저쩌구
} else {
  // 저쩌구 어쩌구
}

저는 디버그 편하게 하기위해 try~catch를 선호하는지라.

try~catch 말고는 원본 소스에서 약간만 수정해보면 좋을거 같습니다.
 


mysqli_report(MYSQLI_REPORT_OFF);
$conn = @mysqli_connect(HOST, USER, PW, DB);
if (!$conn) {
  $error_message = "오류: " . mysqli_connect_error();
} else {
  // 어쩌구 저쩌구
}

여전히 http 500 에러가 나옵니다.

위 코드의 @mysqli_connect($chost, $cuser, $cpw, $cdb) 단계에서 그냥 죽어 버리네요.
그래서 아래 if (!$conn) 줄로 내려 가지를 못합니다.
카페24에 질문해도 잘 모르겠다는 답변이구요.

제 생각에는 카페24의 서버 설정에 문제가 있던지 아니면 php 8.2 의 버그 같아요.
버그인데 요즘 저처럼 mysqli_connect(...) or die() 방식으로 쓰는 사람이 거의 없어서 보고가 안되었나?? 하는 생각을 하였습니다.

며칠 헤맨 뒤 결론은 try catch 밖에 없는것 같네요.
아래와 같이 한 줄로 했습니다.
(뭐 같은 한 줄이니 큰 불만은 없습니다.. 그냥 or 대신 catch 쓴다.. 생각하기로 했습니다..ㅎ)

try {$conn = mysqli_connect($chost, $cuser, $cpw, $cdb);} catch (Exception $e) {die("에러발생: ".$e->getLine());}

무엇 보다 함께 고민해 주셔서 정말 감사드립니다..^^

$host에 localhost말고 127.0.0.1 한번 넣어보세요

안됩니다...
그리고 위 코드에서 or die("에러발생: ".mysqli_error($conn)); 부분은
or die("에러발생: ".mysqli_connect_error($conn)); 입니다. 
어쨌든 '에러발생' 이라는 한글은 나와야 하는데 안나오고 그냥 스크립이 종료되어 500에러가 발생

mysqli_connect_error() 넣어도 문제 생기나요?
https://runebook.dev/ko/docs/php/mysqli.error 해당문서를 참고해보세요!

try {
  $conn = new mysqli($host, $user, $pw, $db);
  $conn->set_charset("utf8");
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to DB');
}

네, 저도 이 try catch 시도해 보았습니다.  거의 유일하게 이 방법만 성공했습니다.
그런데 1줄을 위와 같이 5-6줄로 만드는게 싫어서 다른 방법이 없는지 찾는 중입니다.
php 7 에서는 잘 되는데, 왜 php 8 에서는 안될까요??

다시 정리해 보면 php 에서 에러가 발생했을때 오류를 출력하더라도 그냥 계속 진행하면 되는데 발생 지점에서 스크립트를 끝내 버려서 http 500 에러가 발생하는 것 같습니다.
에러가 발생해도 계속 아래로 진행하는 방법이 없을까요?

try catch로 하실 거면 그대로 하시면 되고 기존처럼 하실 거면 아래처럼 하면 됩니다.


mysqli_report(MYSQLI_REPORT_OFF);
$conn = mysqli_connect(HOST, USER, PW, DB) or die("에러발생: ".mysqli_connect_error());

 

첫 번째 링크 Note 부분 보시면 나오는데 쿼리나 연결에서 오류가 있을 경우 예전에는 객체를 반환했는데 예외 모드가 활성화되어 있지 않을 경우(php 8.1부터)는 false만 리턴하고 죽어 버린다고 합니다.

php 8.1부터 그렇다고 합니다.

 

자세한 내용은 아래 링크 참고해 보세요.

https://www.php.net/manual/en/function.mysqli-connect.php

https://www.php.net/manual/en/mysqli-driver.report-mode.php

https://php.watch/versions/8.1/mysqli-error-mode

설명은 분명 맞는데 MYSQLI_REPORT_OFF 를 해도 안되네요...ㅠ
(여전히 die(...) 까지 가지 못하고 mysqli_connect() 자리에서 바로 http error 500 이 뜨면서 그 자리에서 죽어 버리네요.
느낌에 메뉴얼과 다르게 작동하는 php8 의 버그 같아요....
카페24 측에 문의를 해 두었는데 답변을 받아 보고 방법이 있으면 제가 여기에 다시 알려 드리겠습니다.

자세한 참조까지 검색하고 알려 주셔서 정말 감사합니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 1,178
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT