Une implémentation PHP pure du protocole ouvert Language Server. Fournit une analyse de code statique pour PHP pour n’importe quel IDE.
Utilise le grand analyseur PHP tolérant, la réflexion DocBlock de phpDocumentor et une boucle d'événements pour la concurrence.
Table des matières
Une requête de survol renvoie une ligne de déclaration (marquée du langage php
) et le résumé du docblock. Pour les paramètres, il renverra la balise @param
.
La requête est comparée sans tenir compte de la casse avec le nom complet du symbole.
Non standard : une requête vide renverra tous les symboles trouvés dans l'espace de travail.
Les erreurs d'analyse PHP sont signalées comme des erreurs, les erreurs d'analyse des docblocks sont signalées comme des avertissements. Les erreurs/avertissements du répertoire vendor
sont ignorés.
La complétion, la résolution de type, etc. utiliseront la bibliothèque PHP standard et les extensions communes.
Les définitions consultables à l’échelle mondiale sont :
const
Définitions résolues juste à temps lorsque nécessaire :
use
de la fermeturePas encore pris en charge :
define()
Les espaces de noms ne sont pas considérés comme une déclaration de par leur conception, car ils ne constituent qu'une partie du nom complet et ne correspondent pas à une déclaration unique.
Les définitions/références/survol fonctionnent actuellement pour
use
)use
des instructions pour les classes, les constantes et les fonctionsimplements
/ extends
instanceof
de contrôles Ce serveur de langage implémente l'extension de protocole de fichiers. Si le client exprime son soutien via ClientCapabilities.xfilesProvider
et ClientCapabilities.xcontentProvider
, le serveur demandera des fichiers dans l'espace de travail et le contenu des fichiers via les requêtes du client et n'accédera jamais directement au système de fichiers. Cela permet au serveur de fonctionner dans un environnement isolé comme un conteneur, sur un espace de travail distant ou tout autre protocole différent de file://
.
Lors de l'initialisation, le serveur analysera de manière récursive le répertoire du projet à la recherche de fichiers PHP, les analysera et ajoutera toutes les définitions et références à un index en mémoire. Le temps que cela prend dépend de la taille du projet. Au moment de la rédaction, ce projet contient 78 fichiers + 1560 fichiers en dépendances qui prennent 97 s à analyser et consomment 76 Mo sur une Surface Pro 3. Le serveur de langue est pleinement opérationnel lors de l'indexation et peut répondre aux requêtes avec les définitions déjà indexées. Les demandes de suivi seront quasi instantanées car l'index est conservé en mémoire.
L'activation de XDebug a un impact important sur les performances et peut même faire planter le serveur si le paramètre max_nesting_level
est trop bas.
Ce projet fait suite à d'autres pour les paramètres de communication du protocole et de ligne de commande, par exemple une augmentation majeure de la version du LSP entraînera une augmentation majeure de la version du PHP LS. Les nouvelles fonctionnalités telles que les implémentations de requêtes donneront lieu à une nouvelle version mineure. Tout le reste sera une version de correctif. Tous les cours sont considérés comme internes et ne sont pas soumis au semver.
La méthode d'installation recommandée consiste à utiliser Composer. Exécutez simplement
composer require felixfbecker/language-server
et vous obtiendrez la dernière version stable et toutes les dépendances.
L’exécution composer update
mettra à jour le serveur vers la dernière version ininterrompue.
Après avoir installé le serveur de langue et ses dépendances, vous devez analyser les stubs pour les symboles PHP standard et enregistrer l'index pour une initialisation rapide.
composer run-script --working-dir=vendor/felixfbecker/language-server parse-stubs
Démarrez le serveur de langue avec
php vendor/felixfbecker/language-server/bin/php-language-server.php
--tcp=host:port
(facultatif)Fait en sorte que le serveur utilise une connexion TCP pour communiquer avec le client de langue au lieu d'utiliser STDIN/STDOUT. Le serveur tentera de se connecter à l'adresse spécifiée. Fortement recommandé sous Windows en raison du blocage de STDIO.
Exemple:
php bin/php-language-server.php --tcp=127.0.0.1:12345
--tcp-server=host:port
(facultatif)Fait en sorte que le serveur utilise une connexion TCP pour communiquer avec le client de langue au lieu d'utiliser STDIN/STDOUT. Le serveur écoutera sur l'adresse indiquée pour une connexion. Si PCNTL est disponible, il créera un processus enfant pour chaque connexion. Sinon, n'acceptera qu'une seule connexion et la connexion ne pourra pas être rétablie une fois fermée, générera plutôt un nouveau processus.
Exemple:
php bin/php-language-server.php --tcp-server=127.0.0.1:12345
--memory-limit=integer
(facultatif)Définit la limite de mémoire pour le serveur de langue. Équivalent à la directive php.ini de limite de mémoire. La valeur par défaut est de 4 Go (ce qui est bien plus que nécessaire).
Exemple:
php bin/php-language-server.php --memory-limit=256M
Vous devez au moins PHP 7.0 et Composer installés. Clonez le référentiel et exécutez
composer install
pour installer des dépendances.
Exécutez les tests avec
composer test
Peluches avec
composer lint
Le projet analyse les stubs PHP de PHPStorm pour obtenir la prise en charge des fonctions intégrées PHP. Il les réanalyse si nécessaire après les processus Composer, mais après certaines modifications de code (telles que celles impliquant l'index ou l'analyse), vous devrez peut-être les ré-analyser explicitement :
composer run-script parse-stubs
Pour déboguer avec xDebug, assurez-vous que cela est défini comme variable d'environnement
PHPLS_ALLOW_XDEBUG=1
Cela indique au serveur de langue de ne pas redémarrer sans XDebug s'il détecte que XDebug est activé (XDebug a un impact élevé sur les performances).