AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte PHP Inspection Unit

PHP Inspection Unit

Ein Thema von mirage228 · begonnen am 1. Nov 2004 · letzter Beitrag vom 19. Aug 2007
Antwort Antwort
Seite 2 von 14     12 3412     Letzte » 
Benutzerbild von mirage228
mirage228
Registriert seit: 23. Mär 2003
Hallo,

ich habe mich die letzter Zeit ein wenig mit regulären Ausdrücken beschäftigt. Daraus ist die folgende Unit entstanden.

Mit ihr ist es möglich eine PHP Datei zu analysieren. Dabei werden Klassen und Interfaces mit deren Methoden und Variablen aufgelistet, sowie Methoden ohne Klassenbezug und eingebundene Dateien (über include, require, etc.).
Ab Version 1.9 gibt es auch eine vollständige Unterstützung für Konstanten jeglicher Art (define oder PHP5-Klassenkonstanten).

Das ganze wird hierarchisch in einer Klassenstruktur zusammengefasst. Die für Benutzer relevante Klasse sollte die Klasse TPHPSource in der Unit uPHPInspector.pas sein. Ihr wird beim Konstruktor der PHP Quelltext übergeben und daraus werden die Klassen etc. herausgeparsed. Die anderen Klassen in der Unit sollten nicht direkt instanziert werden.
Die Verwendung der Eigenschaften der einzelnen Klassen sollte relativ einfach sein. Bei Rückfragen, bitte hier in den Thread schreiben.

Zum Parsen verwende ich, wie gesagt, reguläre Ausdrücke. Da die native Delphi Bibliothek Hier im Forum suchenTRegExpr in einem für mich wichtigem Punkt nicht ganz vollständig war, bin ich auf die Wrapperklasse von http://www.renatomancuso.com umgestiegen. Der einzige Nachteile daraus ist der größere overhead, da Anwendungen die PCRE.dll mitliefern müssen, die mit knapp 200 KB zu Buche schlägt.

Neu ab Version 1.2:
Es lässt sich nun eine Syntaxprüfung durchführen. Dazu muss man die Funktion SyntaxCheck der Klasse TPHPSource aufrufen. Dabei kann man zwischen reiner Syntaxprüfung und einer vollständigen Ausführung der Datei wählen. Bei der Syntaxprüfung werden nur rein syntaktische Fehler erkannt. Nicht vorhandene Include-Dateien oder undefinierte Funktionen werden nicht erkannt. Dazu muss der erste Parameter auf TRUE gesetzt werden.
Im Zweiten Parameter "FileName" kann noch eine Datei zur Syntaxprüfung übergeben werden (Die Datei wird nicht automatisch von TPHPSource geparsed!)
Wichtig beim Testen eurer Sources ist, dass ihr die <? und ?> nicht vergessen dürft, da die Syntaxprüfung ansonsten immer = TRUE ergibt (der Text wird dann einfach ausgegeben ohne geparsed zu werden). Zudem wird euer Source dann nicht vom PHP Inspector geparsed, wenn die PHP-Tags (<? .. ?>) fehlen (ab Version 1.6).
Das Verhalten kann durch die StrictPHPTagCheck Eigenschaft beeinflusst werden.

Im Anhang befinden sich nun:
  • PHPInspector.zip Der "PHP Inspector" in der Version 2.6 (PCRE.dll und Wrapper Units included; Version 5.0 vom 26. Oktober 2004)
  • sample_application.zip Eine Beispielanwendung, samt Source.
  • php_source_analyzer.jpg Ein Screenshot der Beispielanwendung.

Freue mich auf euer Feedback

mfG
mirage228
Miniaturansicht angehängter Grafiken
php_source_analyzer_685.jpg  
Angehängte Dateien
Dateityp: zip phpinspector_160.zip (130,1 KB, 272x aufgerufen)
Dateityp: zip sample_application_661.zip (334,9 KB, 300x aufgerufen)

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
 
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#11
  Alt 14. Nov 2004, 07:59
Hi,

Danke erstmal für euer Feedback.

@DSeven:
Ich werde mal schauen, wie sich das am besten realisieren lässt, um nur die Unterschiede in der Datei zu berücksichtigen. Das ist auf jeden Fall eine gute Idee!
Ich hatte auch erst überlegt ein VirtualTreeView in die Beispielanwendung zu packen, aber es ist nur eine Beispielanwendung, die jeder "mal eben so" kompilieren und leicht nachvollziehen soll. Optimale Geschwindigkeit war nicht in erster Linie das Ziel des Beispielprogrammes. Aber mit einem VirtualTreeview wäre es natürlich schneller und besser - aber leider hat nicht jeder das VirtualTreeview

@Pr0g:
Ja, das habe ich gestern auch feststellen können. Der Stacküberlauf wird von der verwendeten PCRE.pas verursacht undzwar bei dem Pattern der CheckIsCommented() funktion, wo auf Kommentare oder Strings geprüft wird. Ich werde das nochmal genauer unter die Lupe nehmen...

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#12
  Alt 14. Nov 2004, 15:52
Hi,

so die neue Version ist fertig (Version 1.4)

Ich konnte das Problem mit EStackOverflow behoben. Der eine RegEx beim Prüfen von Kommentaren war "fehlerhaft" und verursachte den gennanten Fehler.

Auch habe ich die Erkennung von Kommentaren stark optimiert. Anstatt bei jedem Durchlauf den gesamten Quelltext erneut nach Kommentaren zu parsen, werden nun alle Kommentare am Anfang der Analyse im Vorraus bestimmt (neue Klassen TPHPComment und TPHPComments)
Bei meinem Test (viele Klassen mit schön viel Kommentar ) kam ich auf das Ergebnis von ~640ms (jetzt) gegen ~16500ms (alt) für das Analysieren des Codes. Ich werde aber noch versuchen bzgl. Speed etwas mehr rauszuholen.
Das Darstellen im TreeView habe ich nicht mit eingeschlossen, da das etwas länger dauern könnte. Als Lösung kann ich empfehlen, wie bereits vorgeschlagen wurde, das VirtualTreeView von Mike Lischke zu verwenden. Um jedoch so wenige Zusatzkomponenten wie möglich voraussetzen / mitliefern zu können, findet sich im Beispiel ein normales "TreeView" (sollte für Testzwecke aber ausreichend sein).

Aber erstmal viel Spaß mit der neuen Version! (Downloads, wie gehabt, im ersten Beitrag)

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#13
  Alt 14. Nov 2004, 23:01
Zitat von mirage228:
Hi,
Ich werde mal schauen, wie sich das am besten realisieren lässt, um nur die Unterschiede in der Datei zu berücksichtigen. Das ist auf jeden Fall eine gute Idee!
Also mein Parser tut das prinzip zur Zeit nur zur helfte verwirklichen.
Erstmal läuft der gesammte Parser in einem Thread.
Ich parse eigentlich auch immer die gesammte Datei (deshalb verwirkliche ich es ja nur zur helfte) aber ich überprüfe beim erstellen des Trees (VirtualTreeView) ob es den Eintrag bereits gibt, wenn ja überspringe ich den eintrag und gehe zum nächsten. So muss ich nur neue einträge erstellen anstatt das gesammte Tree erneut zu erstellen.

Bringt finde ich erheblich viel Zeit.
Ich versuche zur Zeit den Parser so umzustellen das er nur nach änderungen im Quelltext sucht was aber nur teilweise funktioniert.

Es Funktioniert nur dann wenn man auch die Editor Kompo dem entsprechend umprogrammiert. So das sie sich merkt was geändert wurde.

Also ziemlich kompliziert.
Aber eigentlich lässt sich die benötigte Zeit auch beim erstellen des TreeViews rausholen finde ich.
Teste die geschwindigkeit deines Parsers am besten gegenüber anderen Produkten wie phpEdit. Obwohl der auch sehr langsam ist.

@Pr0g: Arbeite gerade am Stable release
mfg,
Nexis
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#14
  Alt 15. Nov 2004, 06:00
Hi,

ich habe auch versucht zu implementieren, dass wirklich nur unterschiedliche Methoden etc. geparsed werden. Um aber zu untersuchen, dass was geändert wurde, musste ich schon fast das ganze Parsing einmal erledigen, was das ganze Prozedere ca. 1,5x langsamer machte.

Ich hab gestern noch das im Netz gefunden:
http://www.users.on.net/johnson/delphi/textdiff.html

Das sieht ganz brauchbar aus - jetzt muss ich nur schauen, wie sich das auf den Speed auswirkt. Ich hab nämlich das Gefühl das bei kürzeren Sourcen der komplette Neuaufbau am schnellsten ist.

Ich werde mir heute aber dann erstmal phpEdit anschauen und ihn mit meinem Parser vergleichen

Danke für die Tipps

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#15
  Alt 15. Nov 2004, 20:43
Hi,

ich habe heute den Quelltext noch einmal so optimiert, um auch ohne Text-Differenz mehr rauszuholen.
Daraus resultiert die neue Version 1.5

Dabei habe ich folgendes gemacht:
  • Die Reguläre Ausdrücken werden einmalig im initialization Abschnitt erstellt, sodass dies nicht immer wieder geschehen muss. Das spart besonders bei langen Sourcen Zeit.
  • Kommentare werden nur bis zu der Stelle geparsed, an der irgendetwas (Methode, Klasse, ...) gefunden wurde. Das spart Zeit bei Source, welcher nur am Anfang z.B. Includes, Methoden etc. stehen hat und der rest dadrunter normaler Code ist.
  • Zudem habe ich den Kommentar-Algorithmus selbst ein wenig verfeinert (es wird jetzt kein Zweiter durchlauf mehr benötigt). Das spart auch etwas Zeit.

Insgesamt konnte ich eine Geschwindigkeitserhöhung von teils über 20% (variiert nach oben und unten - je nach Source) herausholen!

Aber das mit der Text-Differenz werde ich mir auf jeden Fall noch ansehen @DSeven.

Downloadlinks, wie gehabt, im ersten Beitrag!

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

 
Delphi 7 Personal
 
#16
  Alt 15. Nov 2004, 21:24
Gibt es irgend eine Möglichkeit die Unit ohne Beigabe der Dll nutzen zu können. Durch eine andere Lib, oder sonstwas?

MfG Pr0g
  Mit Zitat antworten Zitat
DSeven
 
#17
  Alt 16. Nov 2004, 00:58
Guten Tag,

Also ich habe heute einen Test mit deinem Parser 1.3 gemacht und einer Datei mit 410 Kb. Es befinden sich da verschiedene Klassen und ein paar variablen und Funktionen.

Dein Parser hat 30 Sekunden gebraucht meiner 132 ms.
ALso du siehst du must noch einiges machen.

PHPEdit hat nur zwei sekunden mehr gebraucht.
OK mein Parser part nicht so viele sachen wie deiner, aber der von phpEdit schon also solltest du dich am speed von PHPEdit orientieren.

mfg,
Nexis
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#18
  Alt 16. Nov 2004, 05:56
Zitat von Pr0g:
Gibt es irgend eine Möglichkeit die Unit ohne Beigabe der Dll nutzen zu können. Durch eine andere Lib, oder sonstwas?

MfG Pr0g
Hi,

wenn Du mir eine Lib nennen kannst, die PCRE vollständig unterstützt und ohne DLL auskommst, dann wäre das möglich.
Das Problem mit TRegExpr (native Delphi) z.B. ist das einige PCRE Befehle nicht unterstüzt werden (Modifier /R für Rekursion z.B.).
Aber ich denke, dass die 200KB der PCRE.dll nicht viel ausmachen...

Zitat von DSeven:
Guten Tag,

Also ich habe heute einen Test mit deinem Parser 1.3 gemacht und einer Datei mit 410 Kb. Es befinden sich da verschiedene Klassen und ein paar variablen und Funktionen.

Dein Parser hat 30 Sekunden gebraucht meiner 132 ms.
ALso du siehst du must noch einiges machen.

PHPEdit hat nur zwei sekunden mehr gebraucht.
OK mein Parser part nicht so viele sachen wie deiner, aber der von phpEdit schon also solltest du dich am speed von PHPEdit orientieren.

mfg,
Nexis
Also das Ergebnis mit der Version 1.3 überrascht micht nicht sehr. Dort wird bei jedem gefundenen Eintrag die Funktion CheckIsCommented() aufgerufen, die jedesmal den gesamten Quelltext nach Kommentaren und Strings(!) parsed. Das dauert auch so schon teils lange, aber die Funktion wurde je nach gefundenen Einträgen mehrmals aufgerufen.
Das hatte ich in der Version 1.4 verbessert. Damit kam ich auf einen Geschwindigkeitszuwachs von ~16000ms auf ~640ms in meinem Testbeispiel. Mit der Version 1.5 von gestern sollte es noch schneller gehen.

Weisst du zufällig auch, wo ich eine dementsprechend große PHP Datei herbekomme? Die größte, die ich hier habe ist ~75 KB.
Dann werde ich mir heute mal phpEdit runterladen und vergleichen...


Danke nochmal für euer Feedback

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#19
  Alt 16. Nov 2004, 09:04
Guten Tag,

Wow die Version 1.5 brauch für das erste parsen nur ~900 ms und beim zweiten mal gehts noch viel viel schneller. Also das ist perfekt für den gebrauch. Ich glaube da brauchst du nicht mehr viel zu optimieren. Weil es eigentlich genauso wenn nicht schneller ist als bei PHPEdit so viel ich weis. PHPEdit parst die 450 KB große Datei nicht mal

Also die Datei habe ich mir selber zusammengestellt. Einfach eine klasse genommen die mir gefällt und immer wieder hintereinander rein kopiert. So teste ich meinen parser immer

Naja ok werde meinen Parser im Programm durch deinen ersetzen weil deiner PHP 5 Support hat und schneller ist. Muss das ganze nur noch auf VirtualTree umstellen und in einen Thread packen.

Echt klasse dein Parser hoffe das du weiter dran arbeiten wirst!!!!

@Edit: währe es eigentlich möglich ohne viel Zeit zu verlieren auch Variablen zu parsen die keinen klassen bezug haben wie in PHPEdit? Währe das letzte Feature was ich vermisse.
PHPDoc support währe auch klasse.

mfg,
DSeven
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

 
Delphi 7 Personal
 
#20
  Alt 16. Nov 2004, 11:14
Zitat von mirage228:
Hi,

wenn Du mir eine Lib nennen kannst, die PCRE vollständig unterstützt und ohne DLL auskommst, dann wäre das möglich.
Das Problem mit TRegExpr (native Delphi) z.B. ist das einige PCRE Befehle nicht unterstüzt werden (Modifier /R für Rekursion z.B.).
Aber ich denke, dass die 200KB der PCRE.dll nicht viel ausmachen...
Es geht mit eigentlich weniger um die 200Kb, sondern mehr darum, dass ich ungern eine zusätliche Dll dem Programm befüge, wenn es irgendwie eine Möglichkeit gibt dies zu vermeiden. Ich werde mich mal umschauen, ob ich eine passenden Lib finden kann.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf