PHP 프로젝트에서 사용되지 않는 함수를 찾는 방법

개발자로서 깨끗하고 효율적인 코드베이스를 유지하는 것은 프로젝트의 장기적인 건강에 매우 중요합니다. 코드의 부풀어 오르기를 유발하고 기술적 부채에 기여하는 일반적인 문제 중 하나는 사용되지 않는 함수입니다. 이 블로그 게시물에서는 내장 PHP 기능과 사용자 지정 스크립트를 사용하여 PHP 프로젝트에서 이러한 사용되지 않는 함수를 효과적으로 식별하는 방법을 살펴보겠습니다.

사용되지 않는 함수 식별의 중요성

사용되지 않는 함수는 다음과 같은 문제를 초래할 수 있습니다:

  • 낭비되는 자원: 추가 코드가 공간을 차지하고 애플리케이션을 느리게 할 수 있습니다.
  • 복잡성: 더 많은 코드가 더 많은 복잡성을 의미하며, 프로젝트를 탐색하고 유지 관리하기 어렵게 만듭니다.
  • 보안 위험: 사용되지 않는 코드는 발견되지 않은 취약점을 우연히 드러낼 수 있습니다.

이러한 함수를 찾아서 제거하는 것은 최적의 코드 관리를 위해 필수적입니다.

PHP 기능을 사용하여 사용되지 않는 함수 찾기

PHP는 코드베이스를 분석하는 데 활용할 수 있는 몇 가지 내장 기능을 제공합니다. 두 가지 주목할 만한 기능은 다음과 같습니다:

  • 리플렉션: 클래스, 메서드 및 함수에 대해 반영하여 사용을 이해할 수 있는 기능을 제공합니다.
  • token_get_all()을 이용한 토큰화: 이 함수는 PHP 코드를 토큰으로 파싱하여 코드의 구조를 식별하기 쉽게 만듭니다.

하지만 이러한 기능만으로는 완전한 그림을 얻기 어려울 수 있으며, 이때 사용자 지정 스크립트가 도움이 될 수 있습니다.

빠르고 간단한 솔루션: 사용자 지정 PHP 스크립트

최근 연구 및 커뮤니티 피드백을 바탕으로, PHP 프로젝트에서 사용되지 않는 함수를 찾는 데 도움이 되는 사용자 지정 스크립트를 소개합니다. 이 스크립트는 프로젝트 디렉토리를 스캔하여 함수 정의와 그 참조를 식별하고, 읽기 쉬운 형식으로 결과를 제공합니다.

1단계: 환경 설정

  • PHP 환경이 설정되어 있는지 확인합니다.
  • 프로젝트 디렉토리 경로가 정확한지 확인합니다.
  • 다음 스크립트를 새 .php 파일에 복사합니다.

2단계: PHP 스크립트

<?php
$functions = array();
$path = "/path/to/my/php/project"; // 이 경로를 프로젝트 디렉토리로 업데이트하십시오.
define_dir($path, $functions);
reference_dir($path, $functions);
echo "<table>";
echo "<tr><th>이름</th><th>정의된</th><th>참조된</th></tr>";
foreach ($functions as $name => $value) {
    echo "<tr><td>" . htmlentities($name) . "</td>";
    echo "<td>" . (isset($value[0]) ? count($value[0]) : "-") . "</td>";
    echo "<td>" . (isset($value[1]) ? count($value[1]) : "-") . "</td></tr>";
}
echo "</table>";

function define_dir($path, &$functions) {
    if ($dir = opendir($path)) {
        while (($file = readdir($dir)) !== false) {
            if (substr($file, 0, 1) == ".") continue;
            if (is_dir($path . "/" . $file)) {
                define_dir($path . "/" . $file, $functions);
            } else {
                if (substr($file, - 4) != ".php") continue;
                define_file($path . "/" . $file, $functions);
            }
        }
    }       
}

function define_file($path, &$functions) {
    $tokens = token_get_all(file_get_contents($path));
    for ($i = 0; $i < count($tokens); $i++) {
        $token = $tokens[$i];
        if (is_array($token) && $token[0] == T_FUNCTION) {
            $i++;
            $token = $tokens[$i + 1]; // 다음 함수 이름 가져오기
            if (is_array($token) && $token[0] == T_STRING) {
                $functions[$token[1]][0][] = array($path, $token[2]); // 함수 정의를 저장
            }
        }
    }
}

function reference_dir($path, &$functions) {
    if ($dir = opendir($path)) {
        while (($file = readdir($dir)) !== false) {
            if (substr($file, 0, 1) == ".") continue;
            if (is_dir($path . "/" . $file)) {
                reference_dir($path . "/" . $file, $functions);
            } else {
                if (substr($file, - 4) != ".php") continue;
                reference_file($path . "/" . $file, $functions);
            }
        }
    }       
}

function reference_file($path, &$functions) {
    $tokens = token_get_all(file_get_contents($path));
    for ($i = 0; $i < count($tokens); $i++) {
        $token = $tokens[$i];
        if (is_array($token) && $token[0] == T_STRING) {
            if ($tokens[$i + 1][0] == "(") { // 함수 호출 확인
                $functions[$token[1]][1][] = array($path, $token[2]); // 함수 참조를 저장
            }
        }
    }
}
?>

3단계: 스크립트 실행

  1. 스크립트 안의 $path 변수를 당신의 PHP 프로젝트 디렉토리를 가리키도록 업데이트합니다.
  2. 명령 줄 또는 웹 서버를 통해 스크립트를 실행합니다.
  3. 출력은 정의된 횟수 및 참조된 횟수와 함께 모든 함수를 표시하는 HTML 테이블이 될 것입니다.

결론

이 사용자 지정 스크립트는 PHP 프로젝트에서 사용되지 않는 함수를 추적하는 효율적인 방법을 제공합니다. 리플렉션 및 token_get_all()과 같은 PHP의 내장 기능은 강력하지만, 맞춤형 스크립트를 사용하면 사용되지 않는 함수를 식별하고 관리하는 프로세스를 간소화할 수 있습니다. 모범 사례로 간주하여 정기적으로 이 스크립트를 실행하여 코드베이스를 깨끗하고 효율적으로 유지하시기 바랍니다.

프로젝트를 깨끗하게 유지함으로써 성능을 향상시킬 뿐만 아니라 장기적으로 유지 관리 및 협업을 더욱 용이하게 합니다.