O recurso
Just In Time foi adicionado à versão 8 do
PHP lançada em 2020 e promete ganhos interessantes de performance.
Esse recurso pode ser entendido como uma evolução do
OPCache (que já existe) e que permite guardar um trecho de código já processado em memória compartilhada, eliminando alguns passos de processamento para melhorar a performance.
O Just In time, porém, é um passo além: ele permite guardar um trecho já processado diretamente em código binário nativo para a máquina, eliminando momentaneamente o interpretador para turbinar a aplicação!
É claro que não são todas as aplicações que vão se beneficiar deste recurso, mas isso já é uma outra história.
Na instalação padrão do PHP esse recurso vem desabilitado (até o momento da escrita desta dica). Então vamos verificar como está a configuração do ambiente primeiro.
Verificar se JIT está habilitado
Primeiramente, vamos criar um script auxiliar para explorar as configurações do ambiente. Abra seu editor de textos favorito e digite o seguinte código:
<?php
phpinfo();
?>
Salve com o nome "teste.php".
Nosso teste será com o servidor interno do PHP executado pela linha de comando, mas os passos serão os mesmos para o Apache, o que mudará será apenas o arquivo de configuração php.ini.
Vamos então rodar o servidor na porta 9000 na mesma pasta onde está o arquivo teste.php:
php -S localhost:9000
Agora verificamos a configuração acessando
http://localhost:9000/teste.php no navegador:
Podemos ver que estamos usando o arquivo
/etc/php/8.0/cli/php.ini olhando o item "Loaded Configuration File". É esse arquivo que vamos modificar.
Agora vamos verificar se o recurso JIT está ou não habilitado. Descemos a página até encontrar o item "JIT" na seção "Zend OPcache".
Como podemos ver, está desabilitado.
Modificando o arquivo de configuração php.ini
Primeiramente vamos verificar algumas configurações relacionadas ao opcache:
grep zend_extension /etc/php/8.0/apache2/php.ini
;zend_extension=opcache
grep opcache.enable /etc/php/8.0/apache2/php.ini
;opcache.enable=1
;opcache.enable_cli=1
;opcache.enable_file_override=0
Como podemos ver as linhas estão comentadas, o que significa que o recurso está desabilitado. Pode ser que a linha opcache.enable esteja com valor (opcache.enable=0). Neste caso modifique para o valor 1 e salve o conteúdo.
Precisamos adicionar as seguintes linhas ao final do arquivo:
opcache.jit_buffer_size=100M
opcache.jit=1235
opcache.jit_debug=1
Pode acontecer de o recurso JIT não ser habilitado por causa de incompatibilidade com outro plugin ou extensão. Veríamos uma mensagem como a seguinte:
php -S localhost:9000
Cannot load Zend OPcache - it was already loaded
[Sun Jun 5 23:06:44 2022] PHP Warning: JIT is incompatible with third party extensions that override zend_execute_ex(). JIT disabled. in Unknown on line 0
Warning: JIT is incompatible with third party extensions that override zend_execute_ex(). JIT disabled. in Unknown on line 0
[Sun Jun 5 23:06:44 2022] PHP 8.0.17 Development Server (http://localhost:9000) started
No meu caso, a incompatibilidade foi com a extensão
XDebug, usada durante o desenvolvimento para finalidades de depuração. Será necessário desabilitar essa extensão. Normalmente as extensões são instaladas num diretório conf.d junto ao arquivo php.ini. No meu caso seria /etc/php/8.0/cli/conf.d/. Para facilitar já temos um arquivo com o nome da extensão:
cat /etc/php/8.0/cli/conf.d/20-xdebug.ini
zend_extension=xdebug.so
xdebug.mode = debug
Como podemos ver, a extensão está habilitada. Vamos desabilitar apenas setando o valor "Off".
cat /etc/php/8.0/cli/conf.d/20-xdebug.ini
zend_extension=xdebug.so
;xdebug.mode = debug
xdebug.mode=Off
A partir daqui o recurso já está configurado e operacional se todas as extensões incompatíveis estiverem desabilitadas.
Para testar, precisamos reiniciar o nosso servidor de linha comando (rodar novamente) e se estivermos configurando o Apache precisamos reiniciar o servidor.
sudo systemctl restart apache2
Agora acessamos novamente
http://localhost:9000/teste.php para verificar o status:
Conclusão
Embora a nova versão do PHP tenha trazido novidades interessantes para o quesito performance,pelo menos no momento atual elas não vêm configuradas por padrão, sendo necessário proceder à modificação dos arquivos do sistema.
O ganho pode não ser perceptível para todos os tipos de aplicação. Aquelas de uso mais intensivo de CPU podem apresentar melhores resultados.
Eu usei nesta dica o servidor interno do PHP disponível pela linha de comando, mas as modificações serão as mesmas para o servidor Apache (não testei usando NGinx ou outros servidores http).