PHP 문법 검사 옵션 (-l)


PHP -l 옵션은 ‘Lint(린트)’의 머리글자에서 따온 옵션으로, 해당 PHP 파일을 실제로 실행하지 않고 오직 문법적 오류(Syntax Error)가 존재하는지 여부만 해석하여 판별해 줍니다.

잘못된 코드를 서버에 올려 웹 애플리케이션 전체가 화이트스크린(먹통)이 되거나 작동이 중단되는 런타임 사고를 예방하기 위한 1차 방어선 역할을 수행합니다.


1. 사용법 및 결과 식별


검증하고 싶은 스크립트 파일명 앞에 -l 플래그를 할당하여 명령을 처리합니다.

php -l [검사할_파일명.php]

1) 문법에 이상이 없는 경우 (정상)

$ php -l index.php
No syntax errors detected in index.php

에러가 감지되지 않으면 No syntax errors detected 메시지와 함께 종료 코드 0을 반환합니다.

2) 오타나 기호 누락 등 문법 오류가 있는 경우

$ php -l index.php
Parse error: syntax error, unexpected identifier "echo", expecting ";" or "," in index.php on line 5
Errors parsing index.php

문법 위반 사항이 감지되면 컴파일 에러 원인(Parse error) 및 잘못된 기호, 그리고 에러가 발생한 정확한 코드 행수(Line Number)를 가르쳐주며 비정상 종료 코드(주로 255)를 던집니다.


2. 중요: 린트(Lint)의 한계점 인지


-l 문법 검사는 파싱 단계에서 소스코드의 구문적 구조 규칙만 확인합니다. 따라서 다음과 같은 실행 시점의 논리적 오류(Runtime Error)는 탐지할 수 없음을 반드시 인지해야 합니다.

  • 정의되지 않은 함수 호출 (Call to undefined function)
  • 선언되지 않은 클래스 인스턴스화
  • 0으로 나누기 연산 오류 (Division by zero)
  • 데이터베이스 비밀번호 오입력 등 환경 연결 문제

이러한 로직 결함은 PHPUnit을 통한 단위 테스트나 정적 분석 도구(PHPStan, Psalm)를 추가 동원하여 보정해야 합니다.


3. 실무: 전역 다중 파일 일괄 린트 검사


리눅스/macOS 셸 환경에서 특정 디렉터리 하위의 모든 PHP 소스 코드를 스캔하여 오타가 난 파일들만 추출해 내는 파이프라인 응용식입니다.

# 하위 폴더 전체에서 .php 파일을 찾아 개별 문법 검사를 실행하되, 에러가 난 파일 목록만 추려냄
find . -name "*.php" -exec php -l {} \; | grep -v "No syntax errors"


4. Git Pre-Commit Hook 자동화 연동


개발자가 코드를 커밋(git commit)하기 직전에 오타를 감지해 아예 커밋 처리를 반려하도록 만들어 실수 배포를 원천 차단하는 로컬 환경설정 방식입니다.

프로젝트 폴더의 .git/hooks/pre-commit 실행 스크립트 파일 내부에 아래 쉘 코드를 삽입합니다.

#!/bin/sh
# 커밋 대기 상태(Staged)인 PHP 파일만 필터링하여 루프 스캔
for file in $(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.php$')
do
    # 개별 린트 수행
    php -l "$file" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "❌ [Lint Error] $file 파일에 문법 오류가 존재합니다. 커밋이 거부되었습니다."
        exit 1
    fi
done
exit 0

이 설정을 추가해 두면, 문법적으로 깨진 PHP 코드는 깃 커밋 자체가 막혀 협업 브랜치가 오염되는 상황을 완벽하게 방지해 줍니다.

서브목차