PHP에서 정적 코드 분석 수행

Syed Hassan Sabeeh Kazmi 2023년6월20일
  1. lint 모드를 사용하여 PHP에서 정적 코드 분석 수행
  2. PHPMD 또는 PHP Depend 프로젝트를 사용하여 PHP에서 정적 코드 분석 수행
  3. pfff 도구를 사용하여 PHP에서 정적 코드 분석 수행
  4. HHVM을 사용하여 PHP에서 정적 코드 분석 수행
PHP에서 정적 코드 분석 수행

개발의 중요한 부분은 오류를 식별하고 코드베이스에서 오류를 신속하게 제거하는 것이며 PHP에서 이를 달성하기 위해 정적 코드 분석을 수행하거나 코딩할 수 있습니다. 이 튜토리얼은 lint 모드와 몇 가지 다른 방법이 PHP에서 정적 코드 분석을 수행하는 방법을 설명합니다.

정적 코드 분석은 강력한 유형의 PHP 코드에 대한 많은 유형 관련 기능을 사용하여 버그를 감지하고 일반 개발자 생산성, 자동 완성 및 코드를 리팩토링하는 놀라운 방법입니다. 실행 또는 컴파일 전에 소스 코드를 확인하여 구문 오류를 제거하고 PHP 코딩 표준 및 스타일을 적용하여 코드의 보안 취약성을 감지할 수 있습니다.

lint 모드는 PHP에서 정적 코드 분석을 수행하는 가장 좋은 방법 중 하나이며 php lint, PHPMD, pfffHHVM에 대해 자세히 알아보고 자신에게 맞는 접근 방식을 채택합니다. 더 필요합니다. 그것은 PHP의 유형 시스템에 크게 의존하며 정적 분석을 위해 더 많은 정보를 제공할수록 더 나은 결과를 얻을 수 있으며 코드에서 유형을 선언하는 것은 더 많은 정보를 추가하는 한 가지 방법입니다.

추천 게시물 목록을 가져오는 함수 function exp_funct ($args) {}function exp_funct (array $args) : array {}로 선언하여 정적 코드 분석에 대한 추가 정보를 제공할 수 있습니다. 또는 PHPDoc 주석을 추가하여 함수를 선언하기 전에 // @return array<exp_var>와 같은 함수 입력 및 출력 유형을 선언하거나 초기화할 수 있습니다.

lint 모드를 사용하여 PHP에서 정적 코드 분석 수행

Lint PHP 모드는 정적 코드 분석을 수행하여 구문 오류를 확인하고 사용하지 않는 변수 할당, 초기화 없이 할당된 배열, 가능한 코드 스타일 경고 등을 식별하는 가장 좋은 방법 중 하나입니다. PHP를 실행하여 php -l FILENAME을 사용할 수 있으며 쉘이나 다른 명령줄에서 lint 모드를 실행하지 않고 구문을 검증할 수 있습니다.

인터넷에는 PHP Lint 기반의 많은 고수준 및 저수준 정적 분석기가 있습니다. 예를 들어 php-sat, PHPStan, PHP-CS-Fixerphan은 더 높은 수준의 정적 분석기입니다. 반면 PHP Parsertoken get all(기본 기능)은 PHP Lint를 기반으로 하는 하위 수준 분석기 중 일부입니다.

주어진 소스를 token_get_all(string $code, int $flags = 0): array와 같은 PHP 토큰으로 분할할 수 있으며 token_get_allZend를 사용하여 주어진 코드 문자열을 PHP 언어 토큰으로 구문 분석하는 데 도움이 됩니다. 엔진의 어휘 스캐너. TOKEN_PARSE 매개변수 플래그는 특정 컨텍스트에서 예약어를 사용하는 기능을 인식하고 토큰 식별자 배열을 반환하는 데 도움이 됩니다.

이 메서드에서 반환된 각 토큰 식별자는 토큰 인덱스, 원래 토큰의 문자열 콘텐츠 및 요소 0, 1 및 2의 줄 번호를 각각 포함하는 단일 문자 또는 3개 요소 배열입니다. token_get_all()의 두 가지 예를 찾을 수 있습니다. 하나는 일반적인 용도이고 다른 하나는 예약어를 사용하여 클래스에서 수행하는 것입니다.

<?php
    $userQuota_getToken = token_get_all('<?php echo; ?>');

    foreach ($userQuota_getToken as $get_tokenQ) {
        if (is_array($get_tokenQ)) {
            echo "Line {$get_tokenQ[2]}: ", token_name($get_tokenQ[0]), " ('{$get_tokenQ[1]}')", PHP_EOL;
        }
    }
?>

// 2nd example on class

/*

$token_quota_source = <<<'code'

class A
{
    const PUBLIC = 1;
}
code;

$userQuota_getToken = token_get_all($token_quota_source, TOKEN_PARSE);

foreach ($userQuota_getToken as $get_tokenQ) {
    if (is_array($get_tokenQ)) {
        echo token_name($get_tokenQ[0]) , PHP_EOL;
    }
}

*/

// its output will be something similar
/*

T_OPEN_TAG
T_WHITESPACE
.
.
.
T_CLASS
T_WHITESPACE
T_STRING
.
.

*/

출력:

Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')

또한 런타임 분석기는 lint 모드에서 작동하며 이 프로그래밍 언어의 동적 특성으로 인해 일부 작업에 더 유용합니다. Xdebug는 코드 커버리지 및 기능 추적기가 있는 런타임 분석기입니다.

phpweaver에는 Xdebug 기능 추적이 있으며 결합된 정적/동적 접근 방식을 사용하여 코드 분석을 수행합니다. 프로덕션 서버용 정적 코드 분석기를 찾고 있다면 xhprofXdebug와 유사하지만 더 가볍고 PHP 기반 인터페이스를 포함하는 최고의 lint 모드 정적 분석기입니다.

PHPMD 또는 PHP Depend 프로젝트를 사용하여 PHP에서 정적 코드 분석 수행

이것은 PHP Mess Detector의 약자이며 잘 알려진 Java PMD 도구와 동등한 정적 코드 분석기가 되는 것을 목표로 하는 PHP Depend의 분사 프로젝트입니다. 작곡가를 사용하여 PHP_Depend, curl -s http://getcomposer.org/installer | phpphp composer.phar에는 pdepend/pdepend:2.12.0이 필요하거나 전역적으로 설치된 작곡가가 있는 경우.

반면에 PHPMD는 보다 사용자 친화적이고 PHP_Depend로 측정된 원시 메트릭에 대한 구성하기 쉬운 프런트 엔드가 있으므로 PHP_Depend보다 선호됩니다. 주어진 소스 코드(PHP 코드) 기반을 취하고 간단한 작동 원리를 가지고 있으므로 해당 소스 내에서 잠재적인 버그 또는 주의 사항을 찾거나 찾으려고 시도합니다.

버그 및 구문 오류, 과도하게 복잡한 표현식, 사용되지 않는 속성, 메서드, 매개 변수 및 최적이 아닌 코드를 쉽게 감지할 수 있습니다. 성숙한 PHP 프로젝트 및 정적 코드 분석기인 PHP Mass Detector는 PHP 소스 코드를 분석하기 위해 사전 정의된 규칙의 방대한 라이브러리를 제공합니다.

// Type phpmd [filename|directory] [report format] [ruleset file]

hassan@kazmi ~ $ phpmd PHP/Depend/DbusUI/ xml rulesets/codesize.xml

<?xml version="1.0" encoding="UTF-8" ?>
<pmd version="0.0.1" timestamp="2009-12-19T22:17:18+01:00">
  <file name="/projects/pdepend/PHP/Depend/DbusUI/PHPMD.php">
    <violation beginline="54"
               endline="359"
               rule="TooManyProperties"
               ruleset="Code Size Rules"
               package="PHP_Depend\DbusUI"
               class="PHP_Depend_DbusUI_ResultPrinter"
               priority="1">
      This class has too many properties; consider refactoring it.
    </violation>
  </file>
</pmd>

출력:

This class has too many properties; consider refactoring it.

PHP Mess Detector의 명령줄 사용은 phpmd [파일 이름|디렉토리] [보고서 형식] [규칙 집합 파일]을 입력하여 활성화하거나 사용할 수 있으며 파일/디렉토리 이름을 PHPMD에 다음과 같이 전달할 수 있습니다. 분석을 위한 PHP 소스 코드용 컨테이너. codesize.xml 또는 rulesets 매개변수는 Phar 배포가 아카이브 내부에 규칙 세트 파일을 포함하므로 파일 시스템 참조처럼 보일 수 있습니다.

또한 PHP 프로그래머는 단축 이름이나 참조를 사용하여 phpmd Depend XML codesize와 같은 기본 제공 규칙 세트를 참조할 수 있습니다. PHPMD의 명령줄 인터페이스는 --min-priority, --report-file, --suffixes, --strict 등과 같은 선택적 인수도 허용합니다.

테스트 중인 소스 코드에 적용되는 여러 규칙 세트를 사용하고 세트 이름으로 해당 CLI 도구에 대한 호출을 활성화하여 ~ $ phpmd /path/to/source text codesize 구성을 적용할 수 있습니다. 또한 프로그래머가 사용자 정의 규칙 세트 파일을 내장 규칙 세트와 혼합할 수 있는 심층 구성을 허용하며 ~ $ phpmd /path/to/source text codesize,/my/rules.xml 명령은 완벽한 예입니다. 소스 코드를 분석하기 위한 사용자 지정 규칙 집합을 지정합니다.

pfff 도구를 사용하여 PHP에서 정적 코드 분석 수행

일련의 API 및 도구로서 정적 코드 분석을 수행하여 소스 코드를 인덱싱, 검색, 탐색, 시각화, 리팩터링하고 스타일을 유지하는 소스 간 PHP 코드 변환을 수행할 수 있습니다.

pfff를 컴파일하고 설치하기 쉽습니다. 그러나 go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl 또는 login-now.php:7:4: CHECK: Unused Local variable $title과 같은 복잡한 형식으로 결과를 생성합니다. . $ ~/sw/pfff/scheck ~/code/github/sc/를 사용하여 GitHub의 pfff에 액세스할 수 있습니다.

또한 프로젝트 디렉토리의 commons/parsing_php/ 디렉토리를 복사하고 재귀적 make를 추가하여 구문 분석 라이브러리를 OCaml 애플리케이션에 포함할 수 있습니다. 마지막으로 애플리케이션을 parsing_php/parsing_php.cmacommons/commons.cma 라이브러리와 연결합니다. 또한 이해를 돕기 위해 pfff/demos/Makefile을 살펴보고 소스가 컴파일되면 다음과 같이 pfff를 테스트할 수 있습니다.

$ cd demos/
$ ocamlc -I ../commons/ -I ../parsing_php/ \
../commons/commons.cma ../parsing_php/parsing_php.cma \
show_function_calls1.ml -o show_function_calls
$ ./show_function_calls foo.php

그런 다음 Facebook 아카이브의 pfff 프로젝트에 있는 show_function_calls1.m1의 코드에 따라 foo.php의 함수 호출에 대한 몇 가지 유용한 정보를 stdout에서 볼 수 있어야 합니다. pfff 파서는 매우 생산적이며 phpbb 웹사이트에서 테스트할 수 있습니다.

// source code of pfff command-line
$ cd /tmp
$ wget http://d10xg45o6p6dbl.cloudfront.net/projects/p/phpbb/phpBB-3.0.6.tar.bz2
$ tar xvfj phpBB-3.0.6.tar.bz2
$ cd <pfff_src_directory>
$ ./pfff -parse_php /tmp/phpBB3/

그런 다음 pfff 프로그램은 모든 소스 코드 파일(.php 소스 파일)을 반복하고 각 소스 파일에서 파서를 실행하고 다음과 같은 통계를 출력합니다. NB total files = 265; 완전 = 265; =========> 100%nb good = 183197, nb bad = 0 =========> 100.000000%pfff가 당신의 PHP 소스 코드.

명령줄 프로그램으로서 PHP 언어 파서를 테스트하기 위한 pfff와 같은 다양한 명령을 제공합니다. scheck를 사용하여 버그를 찾을 수 있으며 Emacs 태그 생성기의 lintstag처럼 작동하며 이는 다른 어떤 것보다 더 정확합니다.

sgrep은 정확한 코드 패턴을 쉽게 찾을 수 있도록 하는 합성 grep이며 spatchcodemap, pfff_db, codegraph뿐만 아니라 PHP 코드를 쉽게 리팩터링할 수 있도록 하는 구문 패치입니다. codequery는 소스 파일 집합에 대한 글로벌 분석을 수행하거나 PHP 코드베이스의 구조에 대한 쿼리 정보를 수행하기 위해 pfff 도구에 최근 추가된 일부입니다.

HHVM을 사용하여 PHP에서 정적 코드 분석 수행

Proxygen 및 FastCGI 서버 유형 지원이 내장되어 있으며 완벽한 정적 코드 분석기 중 하나가 될 수 있습니다. HHVM은 Proxygen이 직접 내장된 완전한 기능을 갖춘 웹 서버로 알려져 있으며 사용이 쉽고 소스 코드를 처리하기 때문에 정적 코드 분석에 적극 권장됩니다.

빠른 웹 요청을 서버하고 FastCGInginx를 결합한 것과 동등한 고성능 웹 서버를 제공합니다. 서버 모드에서 HHVM을 실행할 때 Proxygen을 사용하도록 hhvm -m server -p 8080을 구현할 수 있으며 명령줄 구성으로 hhvm.server.port=7777 또는 -d hhvm.server를 입력하여 포트를 설정할 수 있습니다. server.ini 파일의 port=7777.

명시적으로 지정하지 않고 -d hhvm.server.type=proxygen 명령을 사용하여 Proxygen 서버 유형을 정의할 수 있습니다(Proxygen이 기본값임). init 스크립트 HHVM 패키지는 기본적으로 FastCGI 모드에서 시작하며 서버로 자동 시작되기 전에 구성 조정이 필요합니다.

다음은 명령줄에서 다양한 사용자 정의 옵션(server.ini 또는 -d 옵션)을 사용한 HHVM 패키지 구성의 예입니다. 이러한 구성 옵션 중 일부는 기본값이므로 선택 사항이지만 사용자에게 더 많은 정보를 전달하거나 그림을 보여주는 데 도움이 될 수 있습니다.

// initialize a server port
hhvm.server.port = 60
// the default server type is `proxygen`
hhvm.server.type - proxygen
hhvm.server.default_document = source.php
hhvm.error_document404 = source.php
hhvm.server.source_root = /edit/source/php

선택적 구성 옵션을 사용하는 것은 명시적인 문서화 목적에 적합하며 hhvm.server.source_roothhvm.server.port는 명시적 값이 필요할 가능성이 높습니다. HH Virtual Machine은 오픈 소스이며 Hack으로 작성되었으며 JIT(Just-In-Time) 컴파일을 사용하여 탁월한 개발 유연성을 유지하면서 우수한 성능을 달성합니다.

시작된 기본 디렉터리 HHVM 바이너리는 서버에 따라 변경할 수 있는 default_document입니다. PHP 프로젝트의 OS에 HHVM을 설치한 후 sudo update-rc.d hhvm defaultssudo service hhvm restart 명령을 사용하여 HHVM이 부팅 시 서버로 시작되도록 설정할 수 있습니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub