Eine reine PHP-Implementierung des offenen Language Server Protocol. Bietet statische Codeanalyse für PHP für jede IDE.
Verwendet den großartigen toleranten PHP-Parser, die DocBlock-Reflexion von phpDocumentor und eine Ereignisschleife für Parallelität.
Inhaltsverzeichnis
Eine Hover-Anfrage gibt eine Deklarationszeile (gekennzeichnet mit language php
) und die Zusammenfassung des Dokumentblocks zurück. Für Parameter wird das @param
-Tag zurückgegeben.
Die Abfrage wird ohne Berücksichtigung der Groß-/Kleinschreibung mit dem vollständig qualifizierten Namen des Symbols abgeglichen.
Nicht standardmäßig: Eine leere Abfrage gibt alle im Arbeitsbereich gefundenen Symbole zurück.
PHP-Analysefehler werden als Fehler gemeldet, Analysefehler von Dokumentblöcken werden als Warnungen gemeldet. Fehler/Warnungen aus dem vendor
werden ignoriert.
Für die Vervollständigung, Typauflösung usw. werden die Standard-PHP-Bibliothek und gängige Erweiterungen verwendet.
Global durchsuchbare Definitionen sind:
const
Definitionen werden bei Bedarf just-in-time gelöst:
use
Noch nicht unterstützt:
define()
Namespaces gelten nicht als Deklaration, da sie nur einen Teil des vollständig qualifizierten Namens ausmachen und keiner eindeutigen Deklaration zugeordnet werden können.
Definitionen/Referenzen/Hover funktionieren derzeit für
use
)use
-Anweisungen für Klassen, Konstanten und Funktionenimplements
/ extends
instanceof
von Schecks Dieser Sprachserver implementiert die Dateiprotokollerweiterung. Wenn der Client seine Unterstützung über ClientCapabilities.xfilesProvider
und ClientCapabilities.xcontentProvider
zum Ausdruck bringt, fordert der Server Dateien im Arbeitsbereich und Dateiinhalte über Anfragen vom Client an und greift niemals direkt auf das Dateisystem zu. Dadurch kann der Server in einer isolierten Umgebung wie einem Container, in einem Remote-Arbeitsbereich oder mit einem anderen Protokoll als file://
betrieben werden.
Bei der Initialisierung durchsucht der Server das Projektverzeichnis rekursiv nach PHP-Dateien, analysiert sie und fügt alle Definitionen und Referenzen einem In-Memory-Index hinzu. Wie lange dies dauert, hängt von der Projektgröße ab. Zum Zeitpunkt des Schreibens enthält dieses Projekt 78 Dateien + 1560 Dateien in Abhängigkeiten, deren Analyse 97 Sekunden dauert und 76 MB auf einem Surface Pro 3 verbraucht. Der Sprachserver ist während der Indizierung voll betriebsbereit und kann auf Anfragen mit bereits indizierten Definitionen antworten. Folgeanfragen erfolgen nahezu sofort, da der Index im Speicher gehalten wird.
Die Aktivierung von XDebug wirkt sich stark auf die Leistung aus und kann sogar zum Absturz des Servers führen, wenn die Einstellung max_nesting_level
zu niedrig ist.
Dieses Projekt folgt einigen Schritten für die Protokollkommunikation und die Befehlszeilenparameter, z. B. führt eine größere Versionserhöhung des LSP zu einer größeren Versionserhöhung des PHP LS. Neue Funktionen wie Anforderungsimplementierungen führen zu einer neuen Nebenversion. Alles andere wird eine Patch-Veröffentlichung sein. Alle Kurse gelten als intern und unterliegen nicht der Prüfung.
Die empfohlene Installationsmethode ist Composer. Einfach laufen
composer require felixfbecker/language-server
und Sie erhalten die neueste stabile Version und alle Abhängigkeiten.
Durch Ausführen composer update
wird der Server auf die neueste, nicht unterbrechende Version aktualisiert.
Nach der Installation des Sprachservers und seiner Abhängigkeiten müssen Sie die Stubs auf Standard-PHP-Symbole analysieren und den Index für eine schnelle Initialisierung speichern.
composer run-script --working-dir=vendor/felixfbecker/language-server parse-stubs
Starten Sie den Sprachserver mit
php vendor/felixfbecker/language-server/bin/php-language-server.php
--tcp=host:port
(optional)Bewirkt, dass der Server eine TCP-Verbindung für die Kommunikation mit dem Sprachclient verwendet, anstatt STDIN/STDOUT zu verwenden. Der Server versucht, eine Verbindung zur angegebenen Adresse herzustellen. Unter Windows dringend empfohlen, da STDIO blockiert wird.
Beispiel:
php bin/php-language-server.php --tcp=127.0.0.1:12345
--tcp-server=host:port
(optional)Bewirkt, dass der Server eine TCP-Verbindung für die Kommunikation mit dem Sprachclient verwendet, anstatt STDIN/STDOUT zu verwenden. Der Server wartet auf die angegebene Adresse auf eine Verbindung. Wenn PCNTL verfügbar ist, wird für jede Verbindung ein untergeordneter Prozess erstellt. Wenn nicht, wird nur eine Verbindung akzeptiert und die Verbindung kann nach dem Schließen nicht wiederhergestellt werden. Stattdessen wird ein neuer Prozess gestartet.
Beispiel:
php bin/php-language-server.php --tcp-server=127.0.0.1:12345
--memory-limit=integer
(optional)Legt das Speicherlimit für den Sprachserver fest. Entspricht der php.ini-Direktive „memory-limit“. Der Standardwert beträgt 4 GB (was weit mehr als nötig ist).
Beispiel:
php bin/php-language-server.php --memory-limit=256M
Sie benötigen mindestens PHP 7.0 und Composer installiert. Klonen Sie das Repository und führen Sie es aus
composer install
um Abhängigkeiten zu installieren.
Führen Sie die Tests mit aus
composer test
Fusseln mit
composer lint
Das Projekt analysiert die PHP-Stubs von PHPStorm, um Unterstützung für PHP-Builtins zu erhalten. Es analysiert sie nach Bedarf nach Composer-Prozessen erneut, aber nach einigen Codeänderungen (z. B. solche, die den Index oder das Parsen betreffen) müssen Sie sie möglicherweise explizit erneut analysieren:
composer run-script parse-stubs
Um mit xDebug zu debuggen, stellen Sie sicher, dass Sie diese als Umgebungsvariable festgelegt haben
PHPLS_ALLOW_XDEBUG=1
Dadurch wird der Sprachserver angewiesen, nicht ohne XDebug neu zu starten, wenn er erkennt, dass XDebug aktiviert ist (XDebug hat starke Auswirkungen auf die Leistung).