Em alguns cenários corporativos, a atualização completa do sistema operacional não é viável no curto prazo. Isso é comum em ambientes de produção com aplicações legadas ou em servidores compartilhados que precisam manter estabilidade. Foi exatamente o que ocorreu ao tentarmos instalar o PHP 8.3 em um servidor Ubuntu 20.04, cuja versão padrão do repositório ondrej/php
vai apenas até o PHP 8.2.
Como a atualização do sistema operacional estava fora de cogitação, optamos por compilar o PHP 8.3 a partir do código-fonte. A seguir, descrevemos o processo completo, incluindo os principais erros encontrados e as soluções adotadas.
Um dos principais motivos pelos quais o PHP 8.3 não aparece nos repositórios padrão do Ubuntu 20.04 é o ciclo de suporte do próprio sistema. Cada versão do Ubuntu é congelada com um conjunto de pacotes testados e certificados na época do seu lançamento.
Embora receba atualizações de segurança e correções de bugs, o Ubuntu 20.04 não inclui versões de softwares lançadas posteriormente, como o PHP 8.3. Dessa forma, ao executar apt install php8.3
, o gerenciador de pacotes simplesmente não encontra o pacote, pois ele não faz parte dos repositórios oficiais do sistema.
Mesmo o repositório mantido por Ondřej Surý — amplamente utilizado para versões atualizadas do PHP — segue uma lógica semelhante. O mantenedor fornece builds para versões do Ubuntu que ainda possuem suporte ativo e cuja base de dependências é compatível com as novas versões do PHP. Como o Ubuntu 20.04 já está próximo do fim do seu ciclo LTS e utiliza bibliotecas antigas (como versões anteriores do libxml2
e libsqlite3
), o pacote php8.3
não é gerado oficialmente para essa distribuição, justamente para evitar conflitos e falhas de compilação.
Na prática, isso significa que, mesmo adicionando o PPA ppa:ondrej/php
, o sistema não encontrará pacotes do PHP 8.3. Eles só estão disponíveis para versões mais recentes do Ubuntu, como 22.04 (Jammy) e 24.04 (Noble). Por isso, quando é necessário utilizar o PHP 8.3 em servidores baseados no Ubuntu 20.04, a única alternativa está em compilar o código-fonte manualmente ou empacotar uma instalação customizada em /usr/local
, garantindo compatibilidade com o ambiente existente e mantendo a versão original do sistema intacta.
Antes de iniciar a compilação, é essencial instalar os pacotes de compilação e bibliotecas de desenvolvimento. Estes pacotes fornecem os cabeçalhos e dependências necessárias para as extensões nativas do PHP, como libxml
, sqlite
, openssl
e gd
.
sudo apt update
sudo apt install -y build-essential autoconf bison re2c pkg-config \
libxml2-dev libsqlite3-dev libssl-dev libcurl4-openssl-dev \
libjpeg-dev libpng-dev libwebp-dev libfreetype6-dev \
libonig-dev libzip-dev libicu-dev zlib1g-dev
Após isso, baixe e extraia o código-fonte mais recente do PHP:
wget https://www.php.net/distributions/php-8.3.12.tar.gz
tar -xvf php-8.3.12.tar.gz
cd php-8.3.12
O comando ./configure
define quais recursos e extensões serão incluídos no build. Aqui utilizamos um prefixo personalizado (/usr/local/php83
) para manter a nova versão isolada do PHP existente no sistema.
./configure \
--prefix=/usr/local/php83 \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--with-openssl \
--with-zlib \
--with-curl \
--with-zip \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mbstring \
--with-iconv \
--enable-intl \
--enable-opcache \
--with-sqlite3 \
--with-pdo-sqlite \
--with-gd \
--with-jpeg \
--with-webp \
--with-freetype
configure
e suas soluçõesEsse erro indica que o pkg-config
não está instalado ou não está no PATH
. Ele é responsável por localizar bibliotecas como libxml2
.
sudo apt install -y pkg-config libxml2-dev
O PHP precisa dos cabeçalhos de desenvolvimento do SQLite. A instalação do binário sqlite3
não é suficiente.
sudo apt install -y libsqlite3-dev
Se o erro persistir, exporte o caminho padrão do pkg-config
:
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig
Após a instalação, ao tentar iniciar o php-fpm
, esse erro aparece quando o pool www.conf
usa o grupo nobody
, que não existe no sistema. Basta editar a configuração para utilizar o usuário e grupo corretos:
user = www-data
group = www-data
Depois de trocar o PHP compilado, o Laravel passou a exibir o erro SQLSTATE[HY000] [2002] No such file or directory
. Isso ocorre porque o PHP compilado procura o socket MySQL em /tmp/mysql.sock
, enquanto o MariaDB no Ubuntu utiliza /var/run/mysqld/mysqld.sock
.
Para corrigir:
.env
do Laravel:
DB_HOST=127.0.0.1
DB_PORT=3306
DB_SOCKET=/var/run/mysqld/mysqld.sock
php.ini
:
mysqli.default_socket = /var/run/mysqld/mysqld.sock
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock
Com as dependências resolvidas, basta compilar e instalar:
make -j$(nproc)
sudo make install
php.ini
O PHP compilado não gera o arquivo php.ini
automaticamente. É necessário copiá-lo do diretório de origem:
cp php.ini-production /usr/local/php83/lib/php.ini
Depois, adicione as extensões utilizadas:
extension=mysqli
extension=pdo_mysql
extension=gd
Por padrão, o FPM compilado não cria um serviço systemd. Crie o arquivo /etc/systemd/system/php83-fpm.service
:
[Unit]
Description=The PHP 8.3 FastCGI Process Manager
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/php83/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php83/etc/php-fpm.conf
PIDFile=/usr/local/php83/var/run/php-fpm.pid
Restart=always
[Install]
WantedBy=multi-user.target
Ative o serviço:
sudo systemctl daemon-reload
sudo systemctl enable php83-fpm
sudo systemctl start php83-fpm
Verifique:
systemctl status php83-fpm
Se o GD não for incluído no build inicial, é possível compilá-lo isoladamente:
cd /home/prod/php-8.3.12/ext/gd
/usr/local/php83/bin/phpize
./configure --with-php-config=/usr/local/php83/bin/php-config \
--with-freetype --with-jpeg --with-webp --with-png
make -j$(nproc)
sudo make install
Ative no php.ini
:
extension=gd
A extensão Redis é instalada via PECL:
/usr/local/php83/bin/pecl install redis
Ative no php.ini
:
extension=redis
Verifique as extensões carregadas:
/usr/local/php83/bin/php -m
As principais extensões devem aparecer na lista, como:
mysqli
pdo_mysql
gd
intl
zip
redis
O PHP 8.3 está pronto para uso no servidor, sem necessidade de atualizar o Ubuntu e sem impactar as versões já instaladas no sistema.Conclusão
Compilar o PHP manualmente continua sendo uma solução eficaz para servidores que precisam de versões mais recentes sem alterar o sistema base. O processo exige atenção às dependências e à configuração do ambiente, mas oferece controle total sobre os módulos, paths e comportamento do PHP-FPM.
Na Saldaris Consultoria, realizamos esse procedimento para ambientes de hospedagem e aplicações corporativas que exigem estabilidade, compatibilidade e performance ajustada à demanda.