12 Stimmen

Ist es möglich, die Syntax einer PHP-Datei von PHP aus zu überprüfen?

Ich lade dynamisch PHP-Klassendateien mit Autoload. Und diese Dateien könnten aus irgendeinem Grund fehlen oder beschädigt sein.

Autoload meldet erfolgreich fehlende Dateien, so dass die Anwendungslogik dies übernehmen kann. Wenn diese Dateien jedoch beschädigt sind, wird die gesamte Verarbeitung mit einem leeren Bildschirm für den Benutzer und "PHP Parse error: syntax error" im Fehlerprotokoll angehalten.

Ist es möglich, die Syntax einer PHP-Datei anhand des PHP-Codes zu überprüfen?

Ich habe hier nachgesehen: http://us.php.net/manual/en/function.php-check-syntax.php - es ist veraltet.

Und

exec("php -l $file");

scheint ein falscher Weg zu sein ( http://bugs.php.net/bug.php?id=46339 )

Was denken Sie?

4voto

Pascal MARTIN Punkte 384469

Sie sollten wirklich nicht versuchen, PHP-Dateien, die nicht korrekt sind, während der Ausführung zu überprüfen: das würde die Antwortzeit Ihrer Anwendung verkürzen!

Ein "besserer Weg" wäre, php -l von der Kommandozeile aus zu verwenden, wenn Sie ein PHP-Skript geändert haben; oder es in Ihren Build-Prozess einzubinden, wenn Sie einen solchen verwenden; oder es als SVN-Pre-Commit-Hook einzufügen, wenn Sie SVN verwenden und definieren können SVN-Haken .

Meiner Meinung nach ist fast jede Lösung besser, als das bei der Ausführung selbst zu überprüfen!

In Anbetracht der Tatsache, dass Fehler wie die, die Sie vermeiden wollen, wahrscheinlich nicht oft vorkommen werden, ist es wahrscheinlich besser, sie... einfach geschehen zu lassen.
Das Einzige, was Sie tun müssen, ist, die Protokolle zu aktivieren und zu überwachen, um schnell feststellen zu können, wann ein Problem auftritt :-)

Das hindert Sie natürlich nicht daran, sich mit dem Fall fehlender Dateien zu befassen, aber das ist ein anderes Thema...

4voto

Saurabh Soni Punkte 51

Eine andere Möglichkeit ist, eine php-Datei in Ihrem Root-Verzeichnis mit dem Namen checkSyntax.php

<?php
for($i=1; $i < count($argv); $i++){
        $temp = "php -l " . $argv[$i];
        $output = exec($temp);
        echo "\n$output";
}
?>

Öffnen Sie nun Ihre bashrc-Datei, um eine Verknüpfung zum Ausführen dieser Datei zu erstellen. Fügen Sie die folgende Zeile ein, um checkSyntax.php auszuführen

alias checkSyntaxErrors='php /root/checkSyntax.php'

und gehen Sie nun in Ihr Quellverzeichnis und machen Sie svn st.

wird eine Liste der Dateien angezeigt, und Sie können den Befehl einfach ausführen.

checkSyntaxErrors file1.php file2.php .......

werden alle als Argumente übergebenen Dateien überprüft.

viel Spaß :)

1voto

Tofandel Punkte 2230

Dies ist eine alte Frage, aber es scheint in neueren PHP-Versionen können wir dies tun

try {
  include_once($file);
} catch (\ParseError $e) {
  // Parse error
} catch (\Throwable $e) {
  // Any other error
}

0voto

Csaba Kétszeri Punkte 674

Kurz gesagt: Ich sehe keine Möglichkeit, dies zu tun, habe aber eine Idee, die ausreichend sein könnte.

Es gibt Log-Monitoring-Programme oder man kann die Logs über Standard-Tools nach Dateien mit Parse-Fehlern filtern. Wenn eine Datei auftaucht, setzen Sie den Schurken-Dateinamen in eine schwarze Liste und Ihr Autoloader prüft vor dem Laden gegen diese Liste.

Bei dieser Methode wird beim ersten Mal ein leerer Bildschirm angezeigt (unter der Annahme, dass die Fehlerberichterstattung auf den Produktionsservern aktiviert ist), beim zweiten Mal jedoch eine Seite ohne die fehlerhafte Komponente.

Im Autoloader sollten Sie eine Liste oder ein Benennungsschema haben, um immer zu versuchen, obligatorische Klassen zu laden (auf andere Weise könnte Ihre Anwendung in einem inkonsistenten Zustand sein)

0voto

Isaac Punkte 1445

Sie könnten auch einige Unit-Tests durchführen, bei denen Sie das PHP laden, das Sie dynamisch ausführen, und behaupten, dass exec("php -l $fileName") gültig ist. Wenn Sie das tun, können Sie es einmal in Ihren Tests überprüfen, indem Sie es mit geeigneten Variablen generieren, und Sie haben ein angemessenes Maß an Vertrauen, dass Ihr PHP gut ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X