PHP 신입 트러블슈팅 면접
새 면접Q. PHP 웹사이트에 접속했을 때 빈 화면(white screen)만 표시되고 아무 내용도 보이지 않습니다. 이 문제를 해결하기 위해 어떤 순서로 디버깅을 진행하시겠습니까?
PHP의 에러 출력 설정과 로그 파일 확인을 생각해보세요.
먼저 php.ini 파일에서 display_errors 설정을 On으로 변경하거나, 스크립트 상단에 error_reporting(E_ALL)과 ini_set('display_errors', 1)을 추가하여 에러 메시지를 화면에 출력하도록 합니다. 그 다음 웹 서버의 에러 로그(Apache의 경우 error_log, Nginx의 경우 error.log)를 확인하여 구체적인 에러 내용을 파악합니다. 에러 메시지를 확인한 후 문법 오류, 치명적 에러(Fatal Error), 또는 메모리 부족 등의 원인을 해결합니다. 문제 해결 후에는 프로덕션 환경에서 display_errors를 다시 Off로 설정하여 보안을 유지합니다.
- • display_errors와 error_reporting 설정으로 에러 출력 활성화
- • 웹 서버 에러 로그 파일 확인
- • 프로덕션 환경에서는 에러 출력을 비활성화하고 로그로만 기록
실제 운영 중인 웹사이트에서 갑작스러운 빈 화면 오류가 발생했을 때 신속하게 원인을 파악하고 복구하는 데 필수적인 절차입니다.
프로덕션 환경에서 에러를 화면에 직접 표시하지 않는 이유는 무엇인가요?
Q. 사용자 로그인 기능이 갑자기 작동하지 않고 'Connection refused' 에러가 발생합니다. MySQL 데이터베이스 연결 문제를 해결하기 위해 확인해야 할 사항들을 순서대로 설명해주세요.
데이터베이스 서버 상태, 연결 정보, 네트워크 설정 순서로 점검해보세요.
먼저 MySQL 서비스가 실행 중인지 확인합니다(systemctl status mysql 또는 service mysql status). 서비스가 중지되어 있다면 재시작합니다. 다음으로 PHP 코드에서 사용하는 데이터베이스 연결 정보(호스트, 포트, 사용자명, 비밀번호, 데이터베이스명)가 정확한지 확인합니다. 방화벽이나 보안 그룹 설정에서 MySQL 포트(기본 3306)가 열려있는지 점검합니다. MySQL 사용자 계정의 호스트 권한을 확인하여 해당 IP에서 접속이 허용되어 있는지 체크합니다. 마지막으로 연결 풀이나 최대 연결 수(max_connections) 제한에 도달했는지 확인합니다.
- • MySQL 서비스 실행 상태 확인 및 재시작
- • 데이터베이스 연결 정보(호스트, 포트, 계정) 검증
- • 방화벽 및 MySQL 사용자 권한 설정 확인
트래픽이 많은 시간대에 데이터베이스 연결 오류가 발생하면 전체 서비스가 마비될 수 있어 신속한 진단이 중요합니다.
데이터베이스 연결 실패를 사전에 방지하기 위해 어떤 모니터링을 할 수 있을까요?
Q. 쇼핑몰 사이트에서 사용자들이 로그인 후 장바구니에 상품을 담았는데, 페이지를 이동할 때마다 장바구니가 초기화되는 문제가 발생했습니다. 세션 데이터가 유지되지 않는 원인과 해결 방법을 설명해주세요.
session_start() 호출 시점과 세션 저장 경로 권한을 점검해보세요.
먼저 모든 페이지에서 session_start()가 출력이나 HTML 코드보다 먼저 호출되는지 확인합니다. 헤더가 이미 전송된 후 session_start()를 호출하면 세션이 시작되지 않습니다. 다음으로 php.ini의 session.save_path에 지정된 디렉토리가 존재하고 웹 서버에 쓰기 권한이 있는지 확인합니다. 쿠키 설정 문제일 수 있으므로 브라우저에서 쿠키가 활성화되어 있고 PHPSESSID 쿠키가 정상적으로 설정되는지 개발자 도구로 확인합니다. 도메인이나 경로 설정 문제로 세션 쿠키가 전송되지 않을 수 있으니 session.cookie_domain과 session.cookie_path 설정도 점검합니다. 여러 서버를 사용하는 환경이라면 세션을 파일이 아닌 데이터베이스나 Redis에 저장하도록 변경해야 합니다.
- • session_start()가 출력 전에 호출되는지 확인
- • 세션 저장 경로의 존재 여부와 쓰기 권한 검증
- • 브라우저 쿠키 설정 및 PHPSESSID 쿠키 전송 확인
전자상거래 사이트에서 세션 문제는 장바구니 손실과 직결되어 매출에 직접적인 영향을 미치므로 즉시 해결해야 합니다.
로드밸런서를 사용하는 다중 서버 환경에서 세션을 어떻게 관리해야 할까요?
Q. 대용량 CSV 파일(100MB)을 업로드하여 데이터베이스에 저장하는 기능을 구현했는데, 파일 처리 중 'Allowed memory size exhausted' 에러가 발생합니다. 이 문제의 원인과 해결 방법을 설명해주세요.
파일을 한 번에 읽지 않고 나누어 처리하는 방법을 고려해보세요.
이 에러는 PHP 스크립트가 설정된 메모리 제한(memory_limit)을 초과했을 때 발생합니다. file_get_contents()나 file()로 파일 전체를 메모리에 읽어들이면 대용량 파일의 경우 메모리 부족이 발생합니다. 해결 방법은 fopen()과 fgets() 또는 fgetcsv()를 사용하여 파일을 한 줄씩 읽어 처리하는 스트림 방식으로 변경하는 것입니다. 각 줄을 처리한 후 unset()으로 변수를 해제하여 메모리를 확보합니다. 데이터베이스 삽입 시에도 한 번에 대량 INSERT하지 않고 배치 단위로 나누어 처리하고, 트랜잭션도 적절히 분할합니다. 임시 방편으로 ini_set('memory_limit', '256M')으로 메모리를 늘릴 수 있지만, 근본적으로는 스트림 방식의 효율적인 코드로 개선해야 합니다.
- • 파일 전체를 메모리에 로드하지 않고 스트림 방식으로 한 줄씩 처리
- • fopen, fgetcsv 등을 사용하여 메모리 효율적으로 읽기
- • 처리 후 변수 해제 및 배치 단위 데이터베이스 삽입
사용자가 업로드한 대용량 엑셀이나 CSV 파일을 처리할 때 서버 메모리를 효율적으로 관리해야 서비스 안정성을 유지할 수 있습니다.
memory_limit을 무제한으로 설정하면 안 되는 이유는 무엇인가요?
Q. 게시판 검색 기능이 작동은 하지만, 보안 점검 중 SQL Injection 취약점이 발견되었습니다. 취약점을 확인하는 방법과 안전하게 수정하는 방법을 설명해주세요.
사용자 입력을 SQL 쿼리에 직접 연결하는 부분과 Prepared Statement를 생각해보세요.
SQL Injection 취약점은 사용자 입력값을 검증 없이 SQL 쿼리에 직접 결합할 때 발생합니다. 검색어에 싱글쿼트(')나 OR 1=1 같은 구문을 입력했을 때 비정상적인 결과가 나오거나 에러가 발생하면 취약점이 존재하는 것입니다. 해결 방법은 PDO나 MySQLi의 Prepared Statement를 사용하여 SQL 쿼리와 데이터를 분리하는 것입니다. 예를 들어 PDO의 경우 prepare()로 쿼리를 준비하고 bindParam() 또는 execute()에 배열로 값을 전달하여 자동으로 이스케이프 처리되도록 합니다. 추가로 사용자 입력값에 대해 htmlspecialchars()로 XSS 방지, filter_var()로 데이터 타입 검증 등 다중 방어를 적용합니다. 재발 방지를 위해 코드 리뷰 시 모든 데이터베이스 쿼리에서 Prepared Statement 사용을 필수 규칙으로 정합니다.
- • Prepared Statement를 사용하여 SQL과 데이터 분리
- • PDO 또는 MySQLi의 bindParam, execute로 안전하게 파라미터 바인딩
- • 입력값 검증 및 코드 리뷰로 재발 방지
실제 서비스에서 SQL Injection 공격으로 개인정보가 유출되면 법적 책임과 함께 서비스 신뢰도가 크게 손상되므로 반드시 사전에 방지해야 합니다.
Prepared Statement 외에 SQL Injection을 방지할 수 있는 다른 방법은 무엇이 있을까요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!