Realizar análisis de código estático en PHP

Syed Hassan Sabeeh Kazmi 8 octubre 2023
  1. Use el modo lint para realizar análisis de código estático en PHP
  2. Use el proyecto PHPMD o PHP Depend para realizar análisis de código estático en PHP
  3. Use la herramienta pfff para realizar análisis de código estático en PHP
  4. Use HHVM para realizar análisis de código estático en PHP
Realizar análisis de código estático en PHP

La parte vital del desarrollo es identificar errores y eliminarlos rápidamente de su base de código, y puede codificar o realizar análisis de código estático para lograr esto en PHP. Este tutorial enseña cómo el modo lint y algunos otros métodos realizan análisis de código estático en PHP.

El análisis de código estático es una forma increíble de detectar errores, aumentar la productividad general del desarrollador, la finalización automática y refactorizar su código utilizando muchas funciones relacionadas con el tipo para su código PHP fuertemente tipado. Antes de la ejecución o compilación, puede verificar su código fuente para eliminar errores de sintaxis y hacer cumplir los estándares y estilos de codificación de PHP para detectar vulnerabilidades de seguridad en su código.

El modo lint es una de las mejores formas de realizar análisis de código estático en PHP, y aprenderá más sobre php lint, PHPMD, pfff y HHVM para adoptar el enfoque que se adapte a sus necesidades. necesita mejor. Se apoya en gran medida en el sistema de tipos de PHP, y cuanta más información proporcione para el análisis estático, mejores resultados obtendrá, y declarar tipos en su código es una forma de agregar más información.

Una función function exp_funct ($args) {} que obtiene una lista de publicaciones destacadas se puede declarar como function exp_funct (array $args) : array {} para proporcionar más información para el análisis de código estático. Alternativamente, puede agregar un comentario PHPDoc para declarar o inicializar los tipos de entrada y salida de la función con algo como // @return array<exp_var> antes de declarar una función.

Use el modo lint para realizar análisis de código estático en PHP

El modo Lint PHP es una de las mejores formas de realizar análisis de código estático para verificar errores de sintaxis e identificar asignaciones de variables no utilizadas, matrices asignadas sin ninguna inicialización, posiblemente advertencias de estilo de código y mucho más. Puede usar php -l NOMBRE DE ARCHIVO ejecutando PHP y validar la sintaxis sin una ejecución en el modo lint desde el shell o cualquier otra línea de comando.

Hay muchos analizadores estáticos de alto y bajo nivel en Internet basados en PHP Lint. Por ejemplo, php-sat, PHPStan, PHP-CS-Fixer y phan son algunos de los analizadores estáticos de más alto nivel; por otro lado, PHP Parser y token get all (función primitiva) son algunos de los analizadores de nivel inferior basados en PHP Lint.

Puede dividir la fuente dada en tokens de PHP como token_get_all(string $code, int $flags = 0): array, y token_get_all lo ayudará a analizar la cadena de código dada en los tokens de lenguaje PHP usando el Zend escáner léxico del motor. El indicador del parámetro TOKEN_PARSE reconoce la capacidad de usar palabras reservadas en un contexto específico y ayuda a devolver una matriz de identificadores de token.

Cada identificador de token devuelto por este método es un solo carácter o una matriz de tres elementos que contiene el índice del token, el contenido de la cadena del token original y el número de línea en los elementos 0, 1 y 2, respectivamente. Encontrará dos ejemplos de token_get_all(); uno es de uso general y el otro lo realiza en una clase usando una palabra reservada.

<?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
.
.

*/

Producción :

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

Además, los analizadores de tiempo de ejecución funcionan en modo lint y son más útiles para algunas cosas debido a la naturaleza dinámica de este lenguaje de programación. El Xdebug es un analizador de tiempo de ejecución con cobertura de código y rastreadores de funciones.

El phpweaver tiene seguimientos de la función Xdebug y utiliza un enfoque combinado estático/dinámico para realizar análisis de código. Si estás buscando un analizador de código estático para servidores de producción, xhprof es el mejor analizador estático en modo lint, similar a Xdebug, pero más ligero e incluye una interfaz basada en PHP.

Use el proyecto PHPMD o PHP Depend para realizar análisis de código estático en PHP

Son las siglas de PHP Mess Detector y es un proyecto derivado de PHP Depend que pretende ser el analizador de código estático equivalente a la conocida herramienta PMD de Java. Puede usar el compositor para instalar PHP_Depend, curl -s http://getcomposer.org/installer | php y php composer.phar requiere pdepend/pdepend:2.12.0 o si tiene algún compositor instalado globalmente.

Por otro lado, PHPMD es preferible a PHP_Depend ya que es más fácil de usar y tiene un front-end fácil de configurar para métricas sin procesar medidas por PHP_Depend. Toma una base de código fuente determinada (código PHP) y, dado que tiene un principio de funcionamiento sencillo, busca o intenta encontrar posibles errores o precauciones dentro de esa fuente.

Puede detectar fácilmente errores y errores de sintaxis, expresiones demasiado complicadas, propiedades no utilizadas, métodos, parámetros y código subóptimo. Como un proyecto PHP maduro y un analizador de código estático, PHP Mass Detector ofrece una amplia biblioteca de reglas predefinidas para analizar el código fuente de 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>

Producción :

This class has too many properties; consider refactoring it.

El uso de la línea de comandos de PHP Mess Detector se puede activar o usar escribiendo phpmd [nombre de archivo|directorio] [formato de informe] [archivo de conjunto de reglas], y es posible pasar un nombre de archivo/directorio a PHPMD como un contenedor para el código fuente de PHP para analizar. Los parámetros codesize.xml o rulesets pueden parecer una referencia del sistema de archivos ya que su distribución Phar incluye los archivos del conjunto de reglas dentro de su archivo.

Además, permite a los programadores de PHP usar nombres abreviados o referencias para referirse a conjuntos de reglas integrados como phpmd Depende del tamaño del código XML. La interfaz de línea de comandos de PHPMD también acepta argumentos opcionales como --min-priority, --report-file, --suffixes, --strict, y muchos más.

Puede aplicar la configuración ~ $ phpmd /path/to/source text codesize utilizando los múltiples conjuntos de reglas aplicados contra el código fuente bajo la prueba y habilitando una llamada a sus herramientas CLI con un nombre establecido. Además, permite una configuración en profundidad para que los programadores mezclen archivos de conjuntos de reglas personalizados con conjuntos de reglas incorporados, y el comando ~ $ phpmd /ruta/a/código de texto fuente,/mi/rules.xml es un ejemplo perfecto de él para especificar sus conjuntos de reglas personalizadas para analizar el código fuente.

Use la herramienta pfff para realizar análisis de código estático en PHP

Como conjunto de API y herramientas, puede realizar análisis de código estático para indexar, buscar, navegar, visualizar, refactorizar el código fuente y transformar el código PHP fuente a fuente preservando el estilo.

Es fácil de compilar e instalar pfff; sin embargo, produce resultados en un formato complejo como go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl o login-now.php:7:4: CHECK: Unused Local variable $title . Puedes acceder a pfff en GitHub usando $ ~/sw/pfff/scheck ~/code/github/sc/.

Además, puede incrustar la biblioteca de análisis en su propia aplicación OCaml copiando los directorios commons/ y parsing_php/ en el directorio de su proyecto y agregando una marca recursiva; al final, vincule la aplicación con la biblioteca parsing_php/parsing_php.cma y commons/commons.cma. Además, observe el pfff/demos/Makefile para una mejor comprensión, y una vez compilada la fuente, puede probar pfff con lo siguiente:

$ 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

Luego, debe poder ver en stdout alguna información útil sobre las llamadas de función en foo.php según el código en show_function_calls1.m1 en el proyecto pfff en los archivos de Facebook. El analizador pfff es extraordinariamente productivo y puede probarlo en el sitio web 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/

El programa pfff debe iterar sobre todos los archivos de código fuente (archivos fuente .php) y ejecutar el analizador en cada archivo fuente y generará algunas estadísticas que muestran, como: NB archivos totales = 265; perfecto = 265; =========> 100% y nb bueno = 183197, nb malo = 0 =========> 100.000000% lo que significa que pfff pudo analizar el 100% de su Código fuente PHP.

Como programa de línea de comandos, presenta diferentes comandos como pfff para probar los analizadores del lenguaje PHP. Puede usar scheck para encontrar errores, y funciona como lint y stag para el generador de etiquetas de Emacs, que es más preciso que cualquier otro.

El sgrep es un grep sintético para facilitar la búsqueda de patrones de código precisos, y spatch es un parche sintáctico para facilitar la refactorización del código PHP, así como codemap, pfff_db, codegraph, y codequery, son algunas de las últimas incorporaciones a la herramienta pfff para realizar un análisis global de un conjunto de archivos fuente o consultar información sobre la estructura de su base de código PHP.

Use HHVM para realizar análisis de código estático en PHP

Tiene soporte integrado de tipo servidor Proxygen y FastCGI y puede ser uno de los analizadores de código estático perfectos. HHVM es conocido como un servidor web totalmente funcional con Proxygen directamente integrado, y su facilidad de uso y procesamiento de código fuente lo hacen muy recomendable para el análisis de código estático.

Sirve solicitudes web rápidas y proporciona un servidor web de alto rendimiento equivalente a FastCGI y nginx combinados. Puede implementar hhvm -m server -p 8080 para usar Proxygen cuando ejecuta HHVM en modo servidor y puede configurar el puerto mediante la configuración de la línea de comandos: hhvm.server.port=7777, o poner -d hhvm.server.port=7777 en su archivo server.ini.

Puede usar el comando -d hhvm.server.type=proxygen para definir el tipo de servidor Proxygen sin especificarlo explícitamente (Proxygen es el predeterminado). Los paquetes HHVM de scripts init se inician en modo FastCGI de forma predeterminada y requieren ajustes de configuración antes de iniciarse automáticamente como servidor.

El siguiente es un ejemplo de configuración del paquete HHVM con diferentes opciones personalizables (opciones server.ini o -d) en la línea de comandos. Recuerde, algunas de estas opciones de configuración son opcionales ya que son el valor predeterminado, pero pueden ayudar a brindar más información o mostrar ilustraciones al usuario.

// 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

El uso de opciones de configuración opcionales es bueno para que la documentación sea explícita, y es muy probable que hhvm.server.source_root y hhvm.server.port necesiten valores explícitos. HH Virtual Machine es de código abierto y está escrito en Hack y utiliza una compilación JIT (justo a tiempo) para lograr un rendimiento superior mientras mantiene una flexibilidad de desarrollo excepcional.

El directorio predeterminado en el que se lanzó el binario HHVM es el documento_predeterminado que puede cambiar en función de su servidor. Después de instalar HHVM en su sistema operativo en su proyecto PHP, puede usar los comandos sudo update-rc.d hhvm defaults y sudo service hhvm restart para configurar HHVM para que se inicie en el arranque como servidor.

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