Uma implementação PHP pura do Protocolo de Servidor de Linguagem aberto. Fornece análise de código estático para PHP para qualquer IDE.
Usa o excelente Tolerant PHP Parser, a reflexão DocBlock do phpDocumentor e um loop de eventos para simultaneidade.
Índice
Uma solicitação instantânea retorna uma linha de declaração (marcada com o idioma php
) e o resumo do docblock. Para Parâmetros, retornará a tag @param
.
A consulta é comparada sem distinção entre maiúsculas e minúsculas em relação ao nome totalmente qualificado do símbolo.
Não padrão: uma consulta vazia retornará todos os símbolos encontrados no espaço de trabalho.
Erros de análise de PHP são relatados como erros, erros de análise de docblocks são relatados como avisos. Erros/Avisos do diretório vendor
são ignorados.
Conclusão, resolução de tipo etc. usarão a biblioteca PHP padrão e extensões comuns.
As definições pesquisáveis globalmente são:
const
Definições resolvidas just-in-time quando necessário:
use
de fechamentoAinda não suportado:
define()
Os namespaces não são considerados uma declaração por design porque constituem apenas uma parte do nome totalmente qualificado e não são mapeados para uma declaração exclusiva.
Definições/referências/hover atualmente funcionam para
use
)use
instruções para classes, constantes e funçõesimplements
/ extends
instanceof
de verificações Este servidor de linguagem implementa a extensão do protocolo de arquivos. Se o cliente expressar suporte por meio de ClientCapabilities.xfilesProvider
e ClientCapabilities.xcontentProvider
, o servidor solicitará arquivos no espaço de trabalho e o conteúdo do arquivo por meio de solicitações do cliente e nunca acessará o sistema de arquivos diretamente. Isso permite que o servidor opere em um ambiente isolado como um contêiner, em um espaço de trabalho remoto ou em qualquer protocolo diferente de file://
.
Após a inicialização, o servidor irá verificar recursivamente o diretório do projeto em busca de arquivos PHP, analisá-los e adicionar todas as definições e referências a um índice na memória. O tempo que isso leva depende do tamanho do projeto. No momento em que este artigo foi escrito, este projeto continha 78 arquivos + 1560 arquivos em dependências que levavam 97s para serem analisados e consumiam 76 MB em um Surface Pro 3. O servidor de linguagem está totalmente operacional durante a indexação e pode responder a solicitações com as definições já indexadas. As solicitações de acompanhamento serão quase instantâneas porque o índice é mantido na memória.
Ter o XDebug habilitado afeta fortemente o desempenho e pode até travar o servidor se a configuração max_nesting_level
for muito baixa.
Este projeto segue sempre para o protocolo de comunicação e parâmetros de linha de comando, por exemplo, um grande aumento na versão do LSP resultará em um grande aumento na versão do PHP LS. Novos recursos, como implementações de solicitações, resultarão em uma nova versão secundária. Todo o resto será um lançamento de patch. Todas as aulas são consideradas internas e não estão sujeitas a semestre.
O método de instalação recomendado é através do Composer. Simplesmente execute
composer require felixfbecker/language-server
e você obterá a versão estável mais recente e todas as dependências.
Executar composer update
atualizará o servidor para a versão mais recente e ininterrupta.
Depois de instalar o servidor de linguagem e suas dependências, você deve analisar os stubs para símbolos PHP padrão e salvar o índice para inicialização rápida.
composer run-script --working-dir=vendor/felixfbecker/language-server parse-stubs
Inicie o servidor de idiomas com
php vendor/felixfbecker/language-server/bin/php-language-server.php
--tcp=host:port
(opcional)Faz com que o servidor use uma conexão TCP para se comunicar com o cliente do idioma em vez de usar STDIN/STDOUT. O servidor tentará se conectar ao endereço especificado. Fortemente recomendado no Windows devido ao bloqueio do STDIO.
Exemplo:
php bin/php-language-server.php --tcp=127.0.0.1:12345
--tcp-server=host:port
(opcional)Faz com que o servidor use uma conexão TCP para se comunicar com o cliente do idioma em vez de usar STDIN/STDOUT. O servidor escutará no endereço fornecido uma conexão. Se PCNTL estiver disponível, irá bifurcar um processo filho para cada conexão. Caso contrário, aceitará apenas uma conexão e a conexão não poderá ser restabelecida depois de fechada; em vez disso, gerará um novo processo.
Exemplo:
php bin/php-language-server.php --tcp-server=127.0.0.1:12345
--memory-limit=integer
(opcional)Define o limite de memória para o servidor de idiomas. Equivalente à diretiva php.ini de limite de memória. O padrão é 4 GB (que é muito mais do que o necessário).
Exemplo:
php bin/php-language-server.php --memory-limit=256M
Você precisa de pelo menos PHP 7.0 e Composer instalados. Clone o repositório e execute
composer install
para instalar dependências.
Execute os testes com
composer test
Lint com
composer lint
O projeto analisa os stubs PHP do PHPStorm para obter suporte para PHP integrados. Ele os analisa novamente conforme necessário após os processos do Composer, mas após algumas alterações no código (como aquelas que envolvem o índice ou a análise) você pode ter que analisá-los novamente explicitamente:
composer run-script parse-stubs
Para depurar com xDebug, certifique-se de ter definido isso como uma variável de ambiente
PHPLS_ALLOW_XDEBUG=1
Isso informa ao Language Server para não reiniciar sem o XDebug se detectar que o XDebug está habilitado (o XDebug tem um alto impacto no desempenho).