Skip to content

Instantly share code, notes, and snippets.

@DerexScript
Created August 15, 2026 20:42
Show Gist options
  • Select an option

  • Save DerexScript/88bb1df38a3bf444a2dea553f2ce1999 to your computer and use it in GitHub Desktop.

Select an option

Save DerexScript/88bb1df38a3bf444a2dea553f2ce1999 to your computer and use it in GitHub Desktop.
CWP with php 8.2.33

Build do PHP-FPM 8.2.33 no CWP

Data da preparação: 15/08/2026.

Estado anterior

Antes desta preparação, o PHP-FPM 8.2 instalado era:

PHP 8.2.29 NTS

O serviço php-fpm82.service permaneceu ativo durante toda a preparação. Nenhum binário, configuração de pool, socket ou arquivo dentro de /opt/alt/php-fpm82/ foi alterado nesta etapa.

O build do PHP 8.2.33 substituirá a instalação 8.2 existente somente quando for iniciado pelo painel.

Arquivos persistentes alterados

  • /usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/8.2.ini

Criado:

  • /usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/build_pecl_module.sh

Modificados:

apcu.sh
imagick.sh
ioncube.sh
mailparse.sh
mcrypt.sh
memcache.sh
mongodb.sh
opcache.sh
redis.sh
sourceguardian.sh
sqlsrv.sh
ssh2.sh
uploadprogress.sh
xdebug.sh

O arquivo 8.2_last_build.ini não existia e não foi criado manualmente. Ele deve ser gerado pelo painel ao clicar em Save Options.

As referências aos quatro scripts pre_run abaixo foram removidas do 8.2.ini, mas os próprios arquivos não foram alterados:

php82.sh
gdavif.sh
ldap.sh
firebird.sh

O imap7.sh foi preservado porque o PHP 8.2 ainda contém a extensão IMAP no core e usa as bibliotecas UW-IMAP.

O script antigo sodium.sh não foi alterado; ele deixou de ser chamado porque Sodium agora é compilado diretamente do fonte oficial do PHP.

Correção do zlib e das opções salvas

O bloco [zlib] continha:

include=zlib-dir

O arquivo também possuía uma seção separada [zlib-dir], que geraria o argumento antigo e desnecessário:

--with-zlib-dir=/usr

A dependência e a seção redundante foram removidas. Isso evita que a interface do CWP trate zlib-dir como uma segunda opção obrigatória e impede o envio do argumento antigo ao configure do PHP 8.2.33.

O zlib continua selecionável e será compilado normalmente com:

--with-zlib=/usr

Ajustes no 8.2.ini

  • mbstring, pcntl, posix, shmop e sockets passam a ser compilados como módulos compartilhados.
  • O PCRE interno do PHP é usado com --without-external-pcre.
  • LDAP usa a sintaxe válida --with-ldap=/usr --with-ldap-sasl.
  • PDO Firebird usa as bibliotecas do sistema em /usr.
  • Sodium é compilado do core com --with-sodium.
  • A segunda seção duplicada de calendar foi removida.
  • O pre-script antigo do AVIF foi removido; a biblioteca disponível no sistema é usada por --with-avif.
  • Os pre-scripts antigos de LDAP e Firebird foram removidos porque as bibliotecas e headers do sistema já estão disponíveis.

Estas opções continuam no core do PHP 8.2 e foram preservadas:

pspell
imap
imap-ssl
kerberos

Depois do ajuste, o painel apresenta 63 opções válidas.

Extensões externas

O novo build_pecl_module.sh usa diretórios temporários exclusivos, downloads HTTPS com falha explícita, versões fixadas, compilação paralela, verificação do arquivo .so, verificação de bibliotecas dinâmicas e criação determinística do arquivo .ini.

Versões fixadas:

APCu             5.1.28
Imagick          3.8.1
Mailparse        3.2.0
Mcrypt           1.0.9
Memcache         8.2
MongoDB          2.3.3
Redis            6.3.0
SQLSRV           5.12.0
PDO_SQLSRV       5.12.0
SSH2             1.5.0
Uploadprogress   2.0.2
Xdebug           3.5.3

SQLSRV e PDO_SQLSRV usam a versão estável 5.12.0. A linha 5.13 está reservada ao PHP 8.3 ou superior; a matriz oficial da Microsoft mantém a linha 5.12 compatível com PHP 8.2. Os metadados PECL de ambos os pacotes 5.12.0 declaram PHP 8.1 como versão mínima.

Isso também substitui os drivers antigos 5.10.0-beta1 presentes na instalação PHP 8.2.29.

O Memcache 8.2 recebe a correção dos includes php_smart_string*.h e é compilado em modo serial para evitar corrida de compilação.

Os loaders são baixados diretamente dos fornecedores e validados antes da ativação:

ionCube:        ioncube_loader_lin_8.2.so
SourceGuardian: ixed.8.2.lin

O opcache.sh é específico para o PHP 8.2. Ele valida e ativa OPcache e mbstring, e mantém os módulos sensíveis comentados nos respectivos arquivos .ini.

Como a instalação 8.2.29 existente carregava Sodium por meio de php.d/sodium.ini, o script também substitui esse INI legado por um comentário. Isso impede tentativa de carregar sodium.so ou aviso de módulo duplicado, pois no PHP 8.2.33 preparado o Sodium pertence ao core.

Estado esperado após o build

Todos os módulos visíveis no painel podem ser selecionados.

Serão compilados, porém permanecerão desativados:

mcrypt
pcntl
posix
shmop
sockets
ssh2
xdebug

Motivos:

  • pcntl: controle de processos, sinais e forks; inadequado para uso geral em servidor web compartilhado.
  • posix: expõe funções e informações POSIX do sistema.
  • shmop: acesso direto à memória compartilhada do sistema.
  • sockets: sockets de baixo nível, clientes, servidores e daemons.
  • ssh2: shell remoto, execução remota, SCP, SFTP e túneis SSH.
  • xdebug: ferramenta de desenvolvimento e depuração, inadequada para produção.
  • mcrypt: extensão obsoleta e não mantida; deve ser substituída por OpenSSL ou Sodium.

Na instalação 8.2.29 anterior, pcntl, posix, shmop, sockets e ssh2 estavam ativos. Depois do novo build eles estarão compilados, mas desativados conforme o padrão adotado nas versões 8.3, 8.4 e 8.5.

Os demais módulos selecionados serão ativados, incluindo IMAP, Pspell, mbstring, OPcache, APCu, Imagick, Memcache, Redis, MongoDB, Uploadprogress, ionCube, SourceGuardian, Mailparse, SQLSRV e PDO_SQLSRV.

Backups

Foi criado um backup individual, anterior às alterações, para cada arquivo modificado. Todos usam o marcador:

pre_php82_20260815_022552.backup

Configuração:

/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/8.2.ini.pre_php82_20260815_022552.backup

Scripts:

/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/apcu.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/imagick.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/ioncube.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/mailparse.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/mcrypt.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/memcache.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/mongodb.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/opcache.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/redis.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/sourceguardian.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/sqlsrv.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/ssh2.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/uploadprogress.sh.pre_php82_20260815_022552.backup
/root/cwp_bkp/usr_local_cwpsrv_htdocs_resources_conf_el8_php-fpm_selector/external_modules/8.2/xdebug.sh.pre_php82_20260815_022552.backup

Os SHA-256 dos backups foram comparados com os originais antes da primeira alteração e todos coincidiram.

Validações realizadas

  • O 8.2.ini foi carregado com parse_ini_file(): 63 seções válidas.
  • Não restou nenhuma dependência include inexistente.
  • Não existem seções duplicadas.
  • Todos os scripts .sh do diretório 8.2 passaram em sh -n.
  • Não restou referência indevida a caminhos ou loaders de outras versões do PHP.
  • O INI legado da extensão Sodium compartilhada será neutralizado durante o build, antes da inicialização do novo PHP 8.2.33.
  • Todas as URLs das versões PECL fixadas responderam com HTTP 200.
  • Os metadados PECL de todas as versões fixadas aceitam o PHP 8.2.33.
  • A versão SQLSRV/PDO_SQLSRV 5.12.0 foi conferida na matriz oficial de compatibilidade da Microsoft para PHP 8.2.
  • Os arquivos oficiais de ionCube e SourceGuardian contêm loaders para PHP 8.2 e os arquivos compactados passaram no teste de integridade.
  • O fonte oficial do PHP 8.2.33 foi submetido a um configure real com os mesmos 53 argumentos que o painel produzirá ao selecionar tudo.
  • O configure terminou com código 0, sem opções desconhecidas ou erros.
  • O preflight confirmou IMAP com SSL e Kerberos, Pspell, mbstring, pcntl, posix, shmop, sockets, OPcache, AVIF, LDAP, PostgreSQL, PDO Firebird, Sodium e Argon2.
  • A ausência de opagent foi registrada apenas como integração opcional de profiling do OPcache e não impede a compilação.
  • Os diretórios temporários das validações foram removidos.
  • Após todas as alterações e testes, o PHP 8.2.29 continuava ativo e sem reinicialização do serviço.

Limpeza pós-build do Sodium legado

Depois da compilação, o arquivo compartilhado da instalação 8.2.29 ainda existia fisicamente em:

/opt/alt/php-fpm82/usr/lib/php/extensions/no-debug-non-zts-20220829/sodium.so

O INI já estava neutralizado e o PHP 8.2.33 carregava Sodium pelo core, mas o arquivo ainda estava mapeado pelo processo antigo PID 862:

laravel-queue-api-evolua.service
/opt/alt/php-fpm82/usr/bin/php artisan queue:work --sleep=3 --tries=3 --timeout=90

Esse worker ainda executava o binário removido do PHP 8.2.29. Após autorização específica, o serviço foi reiniciado de forma controlada. O novo worker PID 2736460 iniciou com o executável atual do PHP 8.2.33, sem módulos antigos mapeados e sem mensagens de erro no journal.

Quando nenhum processo utilizava mais a extensão legada, ela foi removida do diretório ativo por uma movimentação recuperável para:

/root/cwp_bkp/opt_alt_php-fpm82/usr/lib/php/extensions/no-debug-non-zts-20220829/sodium.so.legacy_php82_29_20260815_032326.backup

SHA-256 preservado:

ccd50fb3078029ca8f07af049eead46a0830c161707f88e24ff62dd096a06c11

Validações posteriores à limpeza:

  • o caminho ativo não contém mais sodium.so;
  • nenhum INI ou configuração referencia sodium.so;
  • PHP 8.2.33 inicia sem warnings;
  • Sodium 8.2.33 permanece ativo mesmo com php -n;
  • sodium_crypto_generichash() está disponível;
  • php-fpm82.service permanece ativo;
  • php-fpm -t continua aprovando a configuração;
  • laravel-queue-api-evolua.service permanece ativo no novo binário.

Procedimento no painel

  1. Atualizar a página do CWP para recarregar o 8.2.ini.
  2. Abrir PHP-FPM Selector → PHP 8.2.33 → opções.
  3. Marcar todas as 63 opções exibidas.
  4. Clicar em Save Options.
  5. Confirmar que o arquivo 8.2_last_build.ini foi criado pelo painel.
  6. Iniciar o build do PHP 8.2.33.
  7. Acompanhar:
tail -f /var/log/php-selector-rebuild.log

Depois do build, conferir:

/opt/alt/php-fpm82/usr/bin/php -v
/opt/alt/php-fpm82/usr/bin/php --ini
/opt/alt/php-fpm82/usr/bin/php -m
@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/mongodb.sh

#!/bin/sh
SCRIPT_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)
exec sh "$SCRIPT_DIR/build_pecl_module.sh" mongodb 2.3.3 mongodb extension enabled --enable-mongodb

@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/opcache.sh

#!/bin/sh
set -eu

PHP_PREFIX=/opt/alt/php-fpm82/usr
PHP="$PHP_PREFIX/bin/php"
PHP_CONFIG="$PHP_PREFIX/bin/php-config"
INI_DIR="$PHP_PREFIX/php/php.d"

if [ ! -x "$PHP" ] || [ ! -x "$PHP_CONFIG" ]; then
    echo "ERRO: PHP/php-config do PHP 8.2 não encontrado"
    exit 1
fi

EXT_DIR=$("$PHP_CONFIG" --extension-dir)
OPCACHE_SO="$EXT_DIR/opcache.so"

if [ ! -f "$OPCACHE_SO" ]; then
    echo "ERRO: $OPCACHE_SO não encontrado"
    exit 1
fi

if ! "$PHP" -n -d "zend_extension=$OPCACHE_SO" \
    -r 'exit(extension_loaded("Zend OPcache") ? 0 : 1);'
then
    echo "ERRO: OPcache do PHP 8.2 não pôde ser carregado"
    exit 1
fi

for MODULE in mbstring pcntl posix shmop sockets; do
    if [ ! -f "$EXT_DIR/$MODULE.so" ]; then
        echo "ERRO: $EXT_DIR/$MODULE.so não encontrado"
        exit 1
    fi

    if ! "$PHP" -n -d "extension=$EXT_DIR/$MODULE.so" \
        -r "exit(extension_loaded('$MODULE') ? 0 : 1);"
    then
        echo "ERRO: $MODULE do PHP 8.2 não pôde ser carregado"
        exit 1
    fi
done

install -d -m 0755 "$INI_DIR"

printf '%s\n' '; Sodium compilado no core do PHP 8.2' \
    > "$INI_DIR/sodium.ini"

printf '%s\n' 'extension=mbstring.so' \
    > "$INI_DIR/00-mbstring.ini"

{
    printf 'zend_extension=%s\n' "$OPCACHE_SO"
    printf '%s\n' 'opcache.enable=1'
    printf '%s\n' 'opcache.memory_consumption=128'
    printf '%s\n' 'opcache.interned_strings_buffer=8'
    printf '%s\n' 'opcache.max_accelerated_files=5000'
    printf '%s\n' 'opcache.revalidate_freq=60'
    printf '%s\n' 'opcache.enable_cli=1'
} > "$INI_DIR/opcache.ini"

for MODULE in pcntl posix shmop sockets; do
    printf ';extension=%s.so\n' "$MODULE" \
        > "$INI_DIR/$MODULE.ini"
done

echo "OPcache e mbstring ativados; pcntl, posix, shmop e sockets desativados"

@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/redis.sh

#!/bin/sh
SCRIPT_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)
exec sh "$SCRIPT_DIR/build_pecl_module.sh" redis 6.3.0 redis extension enabled --enable-redis

@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/sourceguardian.sh

#!/bin/sh
set -eu

BUILD_ROOT=/usr/local/src
PHP_PREFIX=/opt/alt/php-fpm82/usr
PHP="$PHP_PREFIX/bin/php"
INI_DIR="$PHP_PREFIX/php/php.d"
DEST_DIR=/usr/local/sourceguardian
LOADER_NAME=ixed.8.2.lin

cd "$BUILD_ROOT"
WORK_DIR=$(mktemp -d "$BUILD_ROOT/php82-sourceguardian.XXXXXX")

cleanup()
{
    cd "$BUILD_ROOT" 2>/dev/null || return
    rm -rf -- "$WORK_DIR"
}

trap cleanup EXIT HUP INT TERM

ARCHIVE="$WORK_DIR/sourceguardian.zip"
EXTRACT_DIR="$WORK_DIR/extracted"

install -d -m 0755 "$EXTRACT_DIR"

curl --fail --location --retry 3 --connect-timeout 20 \
    https://www.sourceguardian.com/loaders/download/loaders.linux-x86_64.zip \
    --output "$ARCHIVE"

unzip -j -o "$ARCHIVE" "$LOADER_NAME" -d "$EXTRACT_DIR"
SOURCE_LOADER="$EXTRACT_DIR/$LOADER_NAME"

if [ ! -f "$SOURCE_LOADER" ]; then
    echo "ERRO: loader SourceGuardian para PHP 8.2 não encontrado"
    exit 1
fi

install -d -m 0755 "$DEST_DIR" "$INI_DIR"
install -m 0644 "$SOURCE_LOADER" "$DEST_DIR/$LOADER_NAME"

if ! "$PHP" -n -d "zend_extension=$DEST_DIR/$LOADER_NAME" \
    -r 'exit(extension_loaded("SourceGuardian") ? 0 : 1);'
then
    echo "ERRO: loader SourceGuardian para PHP 8.2 não pôde ser carregado"
    exit 1
fi

printf 'zend_extension=%s/%s\n' "$DEST_DIR" "$LOADER_NAME" \
    > "$INI_DIR/sourceguardian.ini"

echo "SourceGuardian PHP 8.2 instalado e ativado"

@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/sqlsrv.sh

#!/bin/sh
set -eu

SCRIPT_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)

sh "$SCRIPT_DIR/build_pecl_module.sh" \
    sqlsrv 5.12.0 sqlsrv extension enabled --enable-sqlsrv

exec sh "$SCRIPT_DIR/build_pecl_module.sh" \
    pdo_sqlsrv 5.12.0 pdo_sqlsrv extension enabled --enable-pdo_sqlsrv

@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/ssh2.sh

#!/bin/sh
SCRIPT_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)
exec sh "$SCRIPT_DIR/build_pecl_module.sh" ssh2 1.5.0 ssh2 extension disabled --with-ssh2=/usr/local

@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/uploadprogress.sh

#!/bin/sh
SCRIPT_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)
exec sh "$SCRIPT_DIR/build_pecl_module.sh" uploadprogress 2.0.2 uploadprogress extension enabled --enable-uploadprogress

@DerexScript

Copy link
Copy Markdown
Author

/usr/local/cwpsrv/htdocs/resources/conf/el8/php-fpm_selector/external_modules/8.2/xdebug.sh

#!/bin/sh
SCRIPT_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)
exec sh "$SCRIPT_DIR/build_pecl_module.sh" xdebug 3.5.3 xdebug zend_extension disabled --enable-xdebug

@DerexScript

Copy link
Copy Markdown
Author
cat /etc/*os-release*
AlmaLinux release 8.10 (Cerulean Leopard)
NAME="AlmaLinux"
VERSION="8.10 (Cerulean Leopard)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.10"
PLATFORM_ID="platform:el8"
PRETTY_NAME="AlmaLinux 8.10 (Cerulean Leopard)"
ANSI_COLOR="0;34"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:almalinux:almalinux:8::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"

ALMALINUX_MANTISBT_PROJECT="AlmaLinux-8"
ALMALINUX_MANTISBT_PROJECT_VERSION="8.10"
REDHAT_SUPPORT_PRODUCT="AlmaLinux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.10"
SUPPORT_END=2029-06-01
uname -r
4.18.0-553.153.1.el8_10.x86_64

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment