Führen Sie eine statische Codeanalyse in PHP durch

Syed Hassan Sabeeh Kazmi 8 Oktober 2023
  1. Verwenden Sie den lint-Modus, um eine statische Codeanalyse in PHP durchzuführen
  2. Verwenden Sie das Projekt PHPMD oder PHP Depend, um eine statische Codeanalyse in PHP durchzuführen
  3. Verwenden Sie das pfff-Tool, um eine statische Codeanalyse in PHP durchzuführen
  4. Verwenden Sie HHVM, um eine statische Codeanalyse in PHP durchzuführen
Führen Sie eine statische Codeanalyse in PHP durch

Der entscheidende Teil der Entwicklung besteht darin, Fehler zu identifizieren und sie schnell aus Ihrer Codebasis zu entfernen, und Sie können codieren oder eine statische Codeanalyse durchführen, um dies in PHP zu erreichen. Dieses Tutorial lehrt, wie der lint-Modus und einige andere Methoden eine statische Codeanalyse in PHP durchführen.

Statische Codeanalyse ist eine unglaubliche Möglichkeit, Fehler zu erkennen, die allgemeine Entwicklerproduktivität zu steigern, die automatische Vervollständigung durchzuführen und Ihren Code mithilfe vieler typbezogener Funktionen für Ihren stark typisierten PHP-Code umzugestalten. Vor der Ausführung oder Kompilierung können Sie Ihren Quellcode überprüfen, um Syntaxfehler zu beseitigen und PHP-Codierungsstandards und -stile durchzusetzen, um Sicherheitslücken in Ihrem Code zu erkennen.

Der lint-Modus ist eine der besten Möglichkeiten, um eine statische Codeanalyse in PHP durchzuführen, und Sie werden mehr über php lint, PHPMD, pfff und HHVM erfahren, um den einen Ansatz zu wählen, der zu Ihnen passt braucht besser. Es lehnt sich stark an das Typsystem von PHP an, und je mehr Informationen Sie für die statische Analyse bereitstellen, desto bessere Ergebnisse erhalten Sie, und das Deklarieren von Typen in Ihrem Code ist eine Möglichkeit, weitere Informationen hinzuzufügen.

Eine Funktion function exp_funct ($args) {}, die eine Liste der vorgestellten Posts erhält, kann als function exp_funct (array $args) : array {} deklariert werden, um weitere Informationen für die statische Codeanalyse bereitzustellen. Alternativ können Sie einen PHPDoc-Kommentar hinzufügen, um die Eingabe- und Ausgabetypen der Funktion mit etwas wie // @return array<exp_var> zu deklarieren oder zu initialisieren, bevor Sie eine Funktion deklarieren.

Verwenden Sie den lint-Modus, um eine statische Codeanalyse in PHP durchzuführen

Der Lint PHP-Modus ist eine der besten Möglichkeiten, eine statische Codeanalyse durchzuführen, um Syntaxfehler zu überprüfen und unbenutzte Variablenzuweisungen, zugewiesene Arrays ohne Initialisierung, möglicherweise Codestilwarnungen und vieles mehr zu identifizieren. Sie können php -l FILENAME verwenden, indem Sie PHP ausführen und die Syntax ohne Ausführung im lint-Modus von der Shell oder einer anderen Befehlszeile validieren.

Im Internet gibt es viele High-Level- und Low-Level-Static-Analyzer, die auf PHP Lint basieren. Zum Beispiel sind php-sat, PHPStan, PHP-CS-Fixer und phan einige der übergeordneten statischen Analysatoren; Andererseits sind PHP Parser und token get all (primitive Funktion) einige der untergeordneten Analysatoren, die auf PHP Lint basieren.

Sie können die angegebene Quelle in PHP-Tokens wie token_get_all(string $code, int $flags = 0): array aufteilen, und token_get_all hilft Ihnen, die angegebene Codezeichenfolge mithilfe von Zend in die PHP-Sprachtoken zu parsen. der lexikalische Scanner der Engine. Das Parameter-Flag TOKEN_PARSE erkennt die Möglichkeit, reservierte Wörter in einem bestimmten Kontext zu verwenden, und hilft, ein Array von Token-Identifikatoren zurückzugeben.

Jeder von dieser Methode zurückgegebene Tokenbezeichner ist entweder ein einzelnes Zeichen oder ein Array mit drei Elementen, das den Tokenindex, den Zeichenfolgeninhalt des ursprünglichen Tokens und die Zeilennummer in den Elementen 0, 1 bzw. 2 enthält. Sie finden zwei Beispiele für token_get_all(); eine ist eine allgemeine Verwendung und die andere führt sie mit einem reservierten Wort in einer Klasse aus.

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

*/

Ausgang:

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

Außerdem arbeiten Laufzeitanalysatoren im lint-Modus und sind aufgrund der dynamischen Natur dieser Programmiersprache für einige Dinge nützlicher. Der Xdebug ist ein Runtime-Analyzer mit Code Coverage und Function Tracern.

Der phpweaver verfügt über Xdebug-Funktionsspuren und verwendet einen kombinierten statischen/dynamischen Ansatz zur Durchführung der Codeanalyse. Wenn Sie nach einem statischen Code-Analysator für Produktionsserver suchen, ist xhprof der beste statische Analysator im lint-Modus, ähnlich wie Xdebug, aber leichter und enthält eine PHP-basierte Schnittstelle.

Verwenden Sie das Projekt PHPMD oder PHP Depend, um eine statische Codeanalyse in PHP durchzuführen

Es steht für PHP Mess Detector und ist ein Spin-off-Projekt von PHP Depend, das darauf abzielt, das Äquivalent zum statischen Code-Analysator des bekannten Java-Tools PMD zu sein. Sie können Composer verwenden, um PHP_Depend, curl -s http://getcomposer.org/installer | php und die php composer.phar erfordert pdepend/pdepend:2.12.0 oder wenn Sie einen global installierten Composer haben.

Andererseits ist PHPMD gegenüber PHP_Depend vorzuziehen, da es benutzerfreundlicher ist und ein einfach zu konfigurierendes Frontend für Rohmetriken hat, die von PHP_Depend gemessen werden. Es basiert auf einem bestimmten Quellcode (PHP-Code) und sucht oder versucht, potenzielle Fehler oder Warnungen in dieser Quelle zu finden, da es ein einfaches Arbeitsprinzip hat.

Es kann Bugs und Syntaxfehler, überkomplizierte Ausdrücke, ungenutzte Eigenschaften, Methoden, Parameter und suboptimalen Code leicht erkennen. Als ausgereiftes PHP-Projekt und statischer Code-Analysator bietet PHP Mass Detector eine umfangreiche Bibliothek vordefinierter Regeln zur Analyse des PHP-Quellcodes.

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

Ausgang:

This class has too many properties; consider refactoring it.

Die Verwendung der Befehlszeile des PHP Mess Detectors kann aktiviert oder verwendet werden, indem Sie phpmd [Dateiname|Verzeichnis] [Berichtsformat] [Regelsatzdatei] eingeben, und es ist möglich, einen Datei-/Verzeichnisnamen an PHPMD als zu übergeben Container für PHP-Quellcode zur Analyse. Die Parameter codesize.xml oder rulesets können wie eine Dateisystemreferenz aussehen, da ihre Phar-Distribution die Regelsatzdateien in ihrem Archiv enthält.

Darüber hinaus ermöglicht es PHP-Programmierern, verkürzte Namen oder Referenzen zu verwenden, um auf eingebaute Regelsätze wie phpmd Depend XML codesize zu verweisen. Die Kommandozeilenschnittstelle von PHPMD akzeptiert auch optionale Argumente wie --min-priority, --report-file, --suffixes, --strict und viele mehr.

Sie können die Konfiguration ~ $ phpmd /path/to/source text codesize anwenden, indem Sie die mehreren Regelsätze verwenden, die auf den zu testenden Quellcode angewendet werden, und einen Aufruf seiner CLI-Tools mit einem Satznamen ermöglichen. Darüber hinaus ermöglicht es Programmierern eine tiefgreifende Konfiguration, um benutzerdefinierte Regelsatzdateien mit integrierten Regelsätzen zu mischen, und der Befehl ~ $ phpmd /path/to/source text codesize,/my/rules.xml ist ein perfektes Beispiel davon, um Ihre benutzerdefinierten Regelsätze zur Analyse des Quellcodes anzugeben.

Verwenden Sie das pfff-Tool, um eine statische Codeanalyse in PHP durchzuführen

Als eine Reihe von APIs und Tools kann es eine statische Codeanalyse durchführen, um Quellcode zu indizieren, zu suchen, zu navigieren, zu visualisieren, umzugestalten und den Stil von Source-to-Source-PHP-Code zu transformieren.

pfff lässt sich einfach kompilieren und installieren; es erzeugt jedoch Ergebnisse in einem komplexen Format wie go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl oder login-now.php:7:4: CHECK: Unused Local variable $title . Sie erreichen das pfff auf GitHub mit $ ~/sw/pfff/scheck ~/code/github/sc/.

Außerdem können Sie die Parsing-Bibliothek in Ihre eigene OCaml-Anwendung einbetten, indem Sie die Verzeichnisse commons/ und parsing_php/ in Ihr Projektverzeichnis kopieren und ein rekursives make hinzufügen; Am Ende verknüpfen Sie die Anwendung mit der Bibliothek parsing_php/parsing_php.cma & commons/commons.cma. Beachten Sie zum besseren Verständnis auch das pfff/demos/Makefile, und sobald der Quellcode kompiliert ist, können Sie pfff mit Folgendem testen:

$ 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

Danach müssen Sie auf stdout einige hilfreiche Informationen zu den Funktionsaufrufen in foo.php gemäß dem Code in show_function_calls1.m1 im pfff-Projekt auf den Facebook-Archiven sehen können. Der Parser pfff ist ausserordentlich produktiv und kann auf der Webseite phpbb getestet werden.

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

Das pfff-Programm sollte dann über alle Quellcodedateien (.php-Quelldateien) iterieren und den Parser für jede Quelldatei ausführen und einige Statistiken ausgeben, die Folgendes zeigen: NB Gesamtdateien = 265; perfekt = 265; =========> 100% und nb good = 183197, nb bad = 0 =========> 100.000000%, was bedeutet, dass pfff 100% von Ihnen analysieren konnte PHP-Quellcode.

Als Kommandozeilenprogramm verfügt es über verschiedene Befehle wie pfff zum Testen der PHP-Sprachparser. Sie können scheck verwenden, um Fehler zu finden, und es funktioniert wie lint und stag für den Emacs-Tag-Generator, der präziser ist als jeder andere.

Das sgrep ist ein synthetisches grep, um das Auffinden präziser Codemuster zu erleichtern, und spatch ist ein syntaktischer Patch, um das Refactoring von PHP-Code zu vereinfachen, sowie codemap, pfff_db, codegraph und codequery sind einige der neuesten Ergänzungen des pfff-Tools, um globale Analysen an einer Reihe von Quelldateien durchzuführen oder Informationen über die Struktur Ihrer PHP-Codebasis abzufragen.

Verwenden Sie HHVM, um eine statische Codeanalyse in PHP durchzuführen

Es verfügt über eine integrierte Proxygen- und FastCGI-Serverunterstützung und kann einer der perfekten statischen Codeanalysatoren sein. HHVM ist als voll funktionsfähiger Webserver mit direkt eingebautem Proxygen bekannt, und seine Benutzerfreundlichkeit und Verarbeitung des Quellcodes machen ihn für die statische Codeanalyse sehr empfehlenswert.

Es verarbeitet schnelle Webanfragen und bietet einen leistungsfähigen Webserver, der dem kombinierten FastCGI und nginx entspricht. Sie können hhvm -m server -p 8080 verwenden, um Proxygen zu nutzen, wenn Sie HHVM im Servermodus ausführen, und den Port über die Befehlszeilenkonfiguration festlegen: hhvm.server.port=7777, oder indem Sie -d hhvm.server.port=7777 in Ihrer server.ini-Datei platzieren.

Sie können den Befehl -d hhvm.server.type=proxygen verwenden, um den Proxygen-Servertyp zu definieren, ohne ihn explizit anzugeben (Proxygen ist die Standardeinstellung). Die HHVM-Pakete der init-Skripte starten standardmäßig im FastCGI-Modus und erfordern Konfigurationsanpassungen, bevor sie automatisch als Server gestartet werden.

Das Folgende ist ein Beispiel für die HHVM-Paketkonfiguration mit verschiedenen anpassbaren Optionen (server.ini- oder -d-Optionen) in der Befehlszeile. Denken Sie daran, dass einige dieser Konfigurationsoptionen optional sind, da sie die Standardwerte sind, aber sie können dazu beitragen, dem Benutzer mehr Informationen zu liefern oder Illustrationen zu zeigen.

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

Die Verwendung optionaler Konfigurationsoptionen ist gut für Dokumentationszwecke, um explizit zu sein, und hhvm.server.source_root und hhvm.server.port sind höchstwahrscheinlich diejenigen, die explizite Werte benötigen. HH Virtual Machine ist Open Source und in Hack geschrieben und verwendet eine JIT-Kompilierung (Just-in-Time), um eine überlegene Leistung zu erzielen und gleichzeitig eine außergewöhnliche Entwicklungsflexibilität zu gewährleisten.

Das Standardverzeichnis, in dem die HHVM-Binärdatei gestartet wird, ist default_document, das Sie basierend auf Ihrem Server ändern können. Nach der Installation von HHVM auf Ihrem Betriebssystem in Ihrem PHP-Projekt können Sie die Befehle sudo update-rc.d hhvm defaults und sudo service hhvm restart verwenden, um HHVM so einzustellen, dass es beim Booten als Server gestartet wird.

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