Utilizar o Xdebug

O Xdebug é uma extensão para PHP que ajuda o desenvolvimento de aplicações com:

  • trace
  • profiling
  • debug passo a passo

O trace e o profiling são uteis e faceis de obter: a unica atenção é na ocupação de disco já que tendem a produzir ficheiros de alguma dimensão.

O debug tem requisitos algo mais complexos mas seguindo este manual deveria ser possível configurar o ambiente de trabalho de forma adequada.

Requisitos

Existem algumas condições para conseguir fazer um debug clássico da aplicação:

  • o servidor ter a extensão Xdebug activa e configurada; para verificar isto é necessário utilizar o phpinfo e verificar se a extensão é presente;
  • ter o plugin “Xdebug helper” instalado no browser

Para analisar aos ficheiros produzidos pelo profiler ou tracer é preciso ter acesso à pasta “/tmp” do servidor.

Se é pretendido executar é preciso também:

  • estar na mesma rede do servidor e este ultimo conseguir chegar ao IP do cliente
  • ter acesso local ás pastas “Wpms” e “Eve” do servidor no mesmo caminho que o próprio servidor (por exemplo “/www/htdocs/Eve”)
  • ter um client de debug instalado (por exemplo “Visual Studio Code”) e configurado para ficar a espera na porta 9000

Vamos ver em detalhe:

Atenção á versão que convém ser 2.7 ou superior
Uma vez instalado deve aparecer uma joaninha no canto superior direito do browser.
Exemplo de configuração que apre uma ligação na porta 9000 e fica a espera

Configuração shares em Linux

Para experimentar ou ter uma ligação temporaria é possivel executar o mount com um comando do tipo:

sudo mount -t cifs -o username=isr-ldonati //192.168.45.223/Wpms /www/htdocs/Wpms

A seguir, no gestor de ficheiro, deveria ser possível aceder ás pastas.

Para ter uma ligação definitiva que volta a estar disponivel depois de um arranque:

  • adaptar o ficheiro /etc/fstab com as seguintes linhas:
    • //192.168.45.223/Wpms /www/htdocs/Wpms cifs x-systemd.automount,_netdev,credentials=/etc/samba-credential.conf,uid=1000,gid=1000,x-gvfs-show,user 0 0
    • //192.168.45.223/Eve /www/htdocs/Eve cifs x-systemd.automount,_netdev,credentials=/etc/samba-credential.conf,uid=1000,gid=1000,x-gvfs-show,user 0 0
  • criar o ficheiro de credenciais /etc/samba-credential.conf com o seguinte conteudo:
    • username=[user]
    • password=[password]
    • domain=ISRETAIL
  • atribuir o ficheiro /etc/samba-credential.conf ao utilizador que pretendemos e deixar o grupo “root”:
    • chown leopoldo.root /etc/samba-credential.conf

Configuração shares em Windows

A configuração necessaria em Windows é:

  • criar directoria local:mkdir C:\htdocsIsRetail
  • criar symbolic links para directorias no servidor com os sources:
  • iniciar VSCode na directoria C:\htdocsIsRetail
  • criar um launch.json default e acrescentar a directiva pathMappings
image.png
Exemplo de ficheiro launch.json com directiva definida. Atenção ao “c:/…” e não “C:/…”

Trace

Profiling

Optimizar o código é muito importante: o sistema passa a ter melhores respostas utilizando menos recursos.

O importante é lembrar que o tempo é um recurso escasso: para o programa correr mas também para o programador. É sempre conveniente encontrar aquela melhoria que em poucos minutos reduz o custo em 50% e não perder um dia em algo que melhora 1%.

Para isto existem instrumentos de profiling.

Uma vez activado no “XDebug Helper” o sinal “Profile”, ao fazer qualquer coisa na aplicação são criados ficheiros no formato “cachegrind.out” + pid do processo na pasta “/tmp/”.

A forma mais simples de analisar estes ficheiros é utilizando um programa de leitura logs como o “KCachegrind”, “QCacheGrind” ou “WinCacheGrind”.

O primeiro impacto pode ser assustador … é precisa alguma calma.

Para ler a documentação sobre KCachegrind é possivel encontrar o manual em https://kcachegrind.github.io/html/Documentation.html

A ideia de base é: encontrar as funções que consomem a maior parte – em percentual – do tempo (sendo que o tempo pode ser expresso em millisegundos, microsegundos, …é relativo) e perceber porque.

Existem substancialmente dois tipos de “problemas”: de facto a função consome muito tempo, a função até é rápida mas é chamada muitas vezes.

Debug

Para conseguir fazer um debug passo a passo de um source é preciso:

  • ligar o debug no xdebug helper para que o cookie seja activado
  • decidir o primeiro ponto de break
  • fazer refresh ou aceder ao report pretendido
Exemplo de debug