PHP CLI 실행 인자 ($argv, $argc) 처리


웹 프라우저 환경에서 작동하는 PHP는 HTTP 프로토콜 규격에 맞춰 클라이언트가 질의한 데이터 값을 GET 또는 POST 글로벌 배열 변수를 통해 넘겨받아 연산합니다.

반면 터미널 콘솔창(CLI) 환경에서는 스크립트 실행 시 키보드로 직접 텍스트 인자를 나열하여 값을 주입합니다. 이를 외부 실행 인자(Command Line Arguments)라고 하며, PHP는 전용으로 선언된 특수 내장 변수인 $argv$argc를 통해 이 데이터를 수신합니다.


1. 외부 인자 전달 및 배열 매핑 원리


터미널에서 php 명령과 스크립트 뒤에 빈칸으로 구분하여 임의의 문자열 인자들을 적어 실행하면, 엔진은 차례대로 이를 메모리 배열에 담아 소스코드 내부에 적재합니다.

$ php app.php --verbose update db_user

이때, PHP 엔진 내부에서는 아래와 같이 데이터 구조가 자동으로 설계 및 매핑됩니다.

  • $argv: 명령줄에서 전달받은 모든 문자열 인자들을 인덱스 순서대로 보관하는 1차원 순차 배열(Indexed Array)입니다.
    • $argv[0]: 실행 중인 자기 자신의 스크립트 상대 경로가 무조건 최우선 할당됩니다. (여기서는 "app.php")
    • $argv[1]: 첫 번째 실 매개 변수가 담깁니다. (여기서는 "--verbose")
    • $argv[2]: 두 번째 변수가 담깁니다. (여기서는 "update")
    • $argv[3]: 세 번째 변수가 담깁니다. (여기서는 "db_user")
  • $argc: 실행 중인 파일 경로($argv[0])를 포함하여 전달받은 전체 인자의 개수를 나타내는 정수형(Integer) 변수입니다. (위 예제의 경우 값은 4가 됩니다.)


2. 가독성 높은 실무 실습 예제


인자 수신 과정을 테스트하기 위해 cli-test.php 파일을 생성하고 아래 소스를 구현해 봅니다.

<?php
// 1. 전체 매개변수 수신량 체크
echo "전달받은 전체 인자 개수 (\$argc) : " . $argc . PHP_EOL;
echo "호출된 스크립트 물리 경로 (\$argv[0]) : " . $argv[0] . PHP_EOL;
echo "----------------------------------------" . PHP_EOL;

// 2. 스크립트 파일명을 제외한 순수 인자값 순회 출력
if ($argc > 1) {
    for ($i = 1; $i < $argc; $i++) {
        echo "매개변수 인덱스 [{$i}] ➡️ " . $argv[$i] . PHP_EOL;
    }
} else {
    echo "⚠️ 스크립트 파일명 외에 전달된 외부 매개 변수가 없습니다." . PHP_EOL;
}

터미널 실행 및 결과 화면

$ php cli-test.php apple banana cherry
전달받은 전체 인자 개수 ($argc) : 4
호출된 스크립트 물리 경로 ($argv[0]) : cli-test.php
----------------------------------------
매개변수 인덱스 [1] ➡️ apple
매개변수 인덱스 [2] ➡️ banana
매개변수 인덱스 [3] ➡️ cherry


3. php.ini 설정과의 연계 (register_argc_argv)


PHP 동작을 정의하는 php.ini 설정 파일에는 $argv$argc 등록 여부를 관할하는 속성이 들어있습니다.

register_argc_argv = On
  • CLI 가동 모드: 이 설정의 On/Off 여부와 상관없이 PHP CLI SAPI 엔진은 항상 이 값을 On으로 고정하여 동작하게 만듭니다. 따라서 CLI 상에서는 언제나 이 배열을 참조하여 스케줄러 등을 가동할 수 있습니다.
  • 웹 서버 가동 모드: 웹서버 연동 시에는 기본적으로 이 값이 Off로 꺼져 있는 경우가 대부분입니다. 웹 요청 시 쓸데없는 오버헤드와 전역 데이터 오염을 예방하기 위함입니다. 만약 HTTP GET 쿼리 스트링(예: ?a=1&b=2)을 마치 CLI 인자처럼 배열로 바인딩하여 복고풍으로 읽고 싶다면 On으로 활성화할 수도 있으나, 보안 및 현대 MVC 프레임워크 설계 흐름상 권장하지 않습니다.
서브목차