Una implementación PHP pura del protocolo abierto de servidor de idiomas. Proporciona análisis de código estático para PHP para cualquier IDE.
Utiliza el excelente analizador PHP tolerante, la reflexión DocBlock de phpDocumentor y un bucle de eventos para la concurrencia.
Tabla de contenido
Una solicitud de desplazamiento devuelve una línea de declaración (marcada con el idioma php
) y el resumen del bloque de documentos. Para Parámetros, devolverá la etiqueta @param
.
La consulta compara sin distinguir entre mayúsculas y minúsculas con el nombre completo del símbolo.
No estándar: una consulta vacía devolverá todos los símbolos encontrados en el espacio de trabajo.
Los errores de análisis de PHP se informan como errores, los errores de análisis de bloques de documentos se informan como advertencias. Se ignoran los errores/advertencias del directorio vendor
.
La finalización, resolución de tipos, etc. utilizarán la biblioteca PHP estándar y extensiones comunes.
Las definiciones que se pueden buscar globalmente son:
const
Las definiciones se resolvieron justo a tiempo cuando fue necesario:
use
de cierreAún no compatible:
define()
Los espacios de nombres no se consideran una declaración por diseño porque solo constituyen una parte del nombre completo y no se asignan a una declaración única.
Definiciones/referencias/desplazar el cursor actualmente funcionan para
use
)use
declaraciones para clases, constantes y funcionesimplements
/ extends
instanceof
de cheques Este servidor de idiomas implementa la extensión del protocolo de archivos. Si el cliente expresa soporte a través de ClientCapabilities.xfilesProvider
y ClientCapabilities.xcontentProvider
, el servidor solicitará archivos en el espacio de trabajo y el contenido del archivo a través de solicitudes del cliente y nunca accederá directamente al sistema de archivos. Esto permite que el servidor opere en un entorno aislado como un contenedor, en un espacio de trabajo remoto o cualquier protocolo diferente a file://
.
Tras la inicialización, el servidor escaneará recursivamente el directorio del proyecto en busca de archivos PHP, los analizará y agregará todas las definiciones y referencias a un índice en memoria. El tiempo que esto lleva depende del tamaño del proyecto. Al momento de escribir este artículo, este proyecto contiene 78 archivos + 1560 archivos en dependencias que tardan 97 segundos en analizarse y consumen 76 MB en una Surface Pro 3. El servidor de idiomas está completamente operativo durante la indexación y puede responder a solicitudes con las definiciones ya indexadas. Las solicitudes de seguimiento serán casi instantáneas porque el índice se mantiene en la memoria.
Tener XDebug habilitado afecta en gran medida el rendimiento e incluso puede bloquear el servidor si la configuración max_nesting_level
es demasiado baja.
Este proyecto sigue semver para la comunicación del protocolo y los parámetros de la línea de comando, por ejemplo, un aumento importante de la versión del LSP resultará en un aumento importante de la versión del PHP LS. Las nuevas funciones, como las implementaciones de solicitudes, darán como resultado una nueva versión menor. Todo lo demás será un lanzamiento de parche. Todas las clases se consideran internas y no están sujetas a semver.
El método de instalación recomendado es a través de Composer. Simplemente ejecuta
composer require felixfbecker/language-server
y obtendrá la última versión estable y todas las dependencias.
La ejecución de composer update
actualizará el servidor a la última versión sin interrupciones.
Después de instalar el servidor de idiomas y sus dependencias, debe analizar los códigos auxiliares en busca de símbolos PHP estándar y guardar el índice para una inicialización rápida.
composer run-script --working-dir=vendor/felixfbecker/language-server parse-stubs
Inicie el servidor de idiomas con
php vendor/felixfbecker/language-server/bin/php-language-server.php
--tcp=host:port
(opcional)Hace que el servidor utilice una conexión tcp para comunicarse con el cliente de idioma en lugar de utilizar STDIN/STDOUT. El servidor intentará conectarse a la dirección especificada. Muy recomendado en Windows debido al bloqueo de STDIO.
Ejemplo:
php bin/php-language-server.php --tcp=127.0.0.1:12345
--tcp-server=host:port
(opcional)Hace que el servidor utilice una conexión tcp para comunicarse con el cliente de idioma en lugar de utilizar STDIN/STDOUT. El servidor escuchará en la dirección proporcionada una conexión. Si PCNTL está disponible, bifurcará un proceso secundario para cada conexión. De lo contrario, solo aceptará una conexión y la conexión no se podrá restablecer una vez cerrada; en su lugar, generará un nuevo proceso.
Ejemplo:
php bin/php-language-server.php --tcp-server=127.0.0.1:12345
--memory-limit=integer
(opcional)Establece el límite de memoria para el servidor de idiomas. Equivalente a la directiva php.ini de límite de memoria. El valor predeterminado es 4 GB (que es mucho más de lo necesario).
Ejemplo:
php bin/php-language-server.php --memory-limit=256M
Necesita al menos PHP 7.0 y Composer instalado. Clona el repositorio y ejecuta
composer install
para instalar dependencias.
Ejecute las pruebas con
composer test
Pelusa con
composer lint
El proyecto analiza los códigos auxiliares de PHP de PHPStorm para obtener soporte para las funciones integradas de PHP. Los vuelve a analizar según sea necesario después de que Composer los procese, pero después de algunos cambios de código (como los que involucran el índice o el análisis) es posible que tengas que volver a analizarlos explícitamente:
composer run-script parse-stubs
Para depurar con xDebug, asegúrese de tener esto configurado como una variable de entorno
PHPLS_ALLOW_XDEBUG=1
Esto le indica al servidor de idiomas que no se reinicie sin XDebug si detecta que XDebug está habilitado (XDebug tiene un alto impacto en el rendimiento).