Como Corrigir o Ecrã Branco (White Screen of Death) ao Mudar para PHP 8.x no SMF 2.0

Iniciado por candidosa2, Ontem às 04:47

Tópico anterior - Tópico seguinte

0 Membros e 6 Visitantes estão a ver este tópico.

candidosa2

INTRODUÇÃO: O QUE É O ECRÃ BRANCO (WSOD) NO SMF 2.0?

Muitos administradores de fóruns que ainda utilizam a ramificação Simple Machines Forum (SMF) 2.0 deparam-se com um cenário assustador ao atualizar a versão do PHP do servidor para as versões 8.0, 8.1 ou superiores: o temido White Screen of Death (WSOD) ou Ecrã Branco da Morte. Em vez de visualizarem o fórum ou o painel de administração, deparam-se com uma página inteiramente em branco, sem qualquer indicação visual de erro.

Como Administrador Sénior de Fóruns e Programador Core do SMF, trago-lhe este artigo técnico detalhado para explicar o porquê de isto acontecer, como diagnosticar a causa exata na sua infraestrutura, como aplicar correções manuais temporárias nas suas Sources e, mais importante, como planejar a migração definitiva para garantir a segurança e a longevidade da sua comunidade online.

A CAUSA TÉCNICA: A INCOMPATIBILIDADE DO SMF 2.0 COM O PHP 8.X

A arquitetura do SMF 2.0 foi desenhada e desenvolvida numa era em que o PHP 5.3 a 5.6 eram os padrões da indústria. Embora as versões de manutenção mais recentes do SMF 2.0 (como a 2.0.19) tenham recebido retrocompatibilidade para o PHP 7.4, o PHP 8.0 introduziu alterações de quebra estrutural (breaking changes) massivas na linguagem.

O motor do PHP 8.0 removeu diversas funções obsoletas e tornou estritas muitas regras de sintaxe que antes resultavam apenas em avisos (warnings ou notices). No PHP 8.x, estas falhas resultam agora em Fatal Errors, interrompendo imediatamente a execução do interpretador PHP antes mesmo de o SMF carregar o seu sistema de templates.

As principais incompatibilidades de código que causam o ecrã branco no SMF 2.0 são:

1. Uso de create_function(): Esta função foi declarada obsoleta no PHP 7.2 e totalmente removida no PHP 8.0. O SMF 2.0 e modificações antigas usavam amplamente esta função para compilar expressões regulares e callbacks de busca.
2. Sintaxe de chavetas para offsets de strings: A utilização de chavetas para aceder a caracteres de uma string, como $string{0}, foi descontinuada e gera erro fatal no PHP 8.0. O correto agora é o uso de parêntesis retos: $string[0].
3. Passagem de parâmetros nulos a funções nativas: O PHP 8.x é extremamente rigoroso com parâmetros do tipo null passados para funções internas como strlen(), preg_match() ou explode() que esperam strings.
4. Construtores de classes obsoletos: Métodos construtores com o mesmo nome da classe (estilo PHP 4) já não são suportados.

DIAGNÓSTICO: COMO ENCONTRAR O ERRO ESCONDIDO

O ecrã branco ocorre porque o seu servidor está configurado para não exibir erros diretamente aos visitantes por motivos de segurança (display_errors = Off). Para resolver o problema, precisamos primeiro de ver o erro de forma explícita.

Passo 1: Verificar o log de erros do servidor
Aceda ao gestor de ficheiros da sua alojamento ou ligue-se via FTP/SFTP. Na diretoria raiz do seu fórum SMF, procure por um ficheiro chamado error_log ou php_error.log. Abra-o e desça até às últimas linhas. Irá encontrar algo semelhante a isto:

PHP Fatal error: Uncaught Error: Call to undefined function create_function() in /home/user/public_html/Sources/Subs.php:XXXX
Passo 2: Ativar temporariamente a exibição de erros no ecrã
Se não encontrar o ficheiro de log, pode forçar o SMF e o servidor a mostrarem o erro diretamente no navegador. Abra o ficheiro index.php na raiz do seu fórum e, logo após a tag inicial , adicione as seguintes linhas de código:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Guarde o ficheiro e atualize o seu navegador. O ecrã branco deverá ser substituído por uma mensagem de erro detalhada, apontando o ficheiro exato e a linha que estão a falhar nas suas Sources ou Themes.

A SOLUÇÃO IMEDIATA: RETROCEDER A VERSÃO DO PHP

Se o seu fórum está offline e necessita de o restabelecer imediatamente para que os utilizadores não fiquem sem acesso, o método mais rápido não passa por editar código, mas sim por retroceder temporariamente a versão do PHP no seu painel de controlo (cPanel, Plesk, DirectAdmin ou consola CLI do servidor).

1. Aceda ao painel administrativo da sua conta de alojamento.
2. Procure pela opção Selecionar Versão do PHP (Select PHP Version ou MultiPHP Manager).
3. Altere a versão do domínio do seu fórum para o PHP 7.4.
4. Clique em "Aplicar" ou "Guardar".

O seu fórum SMF 2.0 voltará a funcionar instantaneamente. No entanto, tenha em atenção que o PHP 7.4 atingiu o Fim de Vida Útil (EOL - End of Life) oficial em novembro de 2022. Manter o seu servidor a correr uma versão obsoleta do PHP expõe o seu site a vulnerabilidades de segurança severas e a uma performance degradada. Esta ação deve ser vista apenas como um passo de transição temporário.

RESOLUÇÃO MANUAL: APLICAR PATCHES NAS SOURCES (A VIA COMPLEXA)

Se o seu provedor de alojamento removeu o suporte ao PHP 7.4 e o obriga a usar PHP 8.x, e caso não consiga atualizar imediatamente o fórum devido a modificações personalizadas antigas, terá de aplicar correções manuais no código core do SMF 2.0.

Abaixo estão as correções estruturais para os dois erros mais comuns que causam o bloqueio total do fórum:

Caso 1: Corrigir o erro de aceso a strings com chavetas (ex. Subs.php, Load.php)
Se o seu log apontar para erros de sintaxe com parêntesis encaracolados em offsets de strings, procure pela linha indicada.
Código Antigo Incompatível:
$char = $string{0};
Substitua por:
$char = $string[0];

Caso 2: Corrigir erros de create_function() em callbacks e expressões regulares
O PHP 8 não suporta create_function. Terá de reescrever a chamada usando funções anónimas nativas (closures).
Código Antigo Incompatível:
$text = preg_replace_callback($pattern, create_function('$matches', 'return strtolower($matches[1]);'), $text);
Substitua por (Sintaxe Moderna PHP 8):
$text = preg_replace_callback($pattern, function($matches) {
    return strtolower($matches[1]);
}, $text);

Nota: Estas correções manuais exigem conhecimentos profundos de programação em PHP. Executar estes passos de forma incorreta pode comprometer gravemente a integridade dos dados e o funcionamento da base de dados do fórum.

A SOLUÇÃO DEFINITIVA: UPGRADE ABSOLUTO PARA O SMF 2.1.X

A aplicação de patches manuais no SMF 2.0 para compatibilidade com o PHP 8.x é um esforço inglório de curto prazo. À medida que o servidor for atualizado para o PHP 8.1, 8.2 ou 8.3, novos avisos e erros fatais irão surgir devido a outras dezenas de bibliotecas desatualizadas.

A única solução viável e segura a longo prazo é a atualização estrutural para a ramificação SMF 2.1.x (atualmente na sua versão mais estável e madura). O SMF 2.1 foi totalmente reescrito com suporte nativo robusto e otimizado para as versões mais modernas do PHP 8.x, trazendo também melhorias extraordinárias de segurança, um novo sistema de notificações, melhor suporte para dispositivos móveis (responsividade) e uma gestão de anexos moderna.

Resumo do Processo de Upgrade Seguro:

1. Backup Integral e Redundante: Faça um backup completo de todos os ficheiros do servidor via FTP e exporte a base de dados MySQL (recomenda-se via phpMyAdmin ou SSH em formato gzip).
2. Fórum em Modo de Manutenção: Ative o modo de manutenção no seu painel de administração SMF para evitar que utilizadores publiquem novos dados durante a transição.
3. Download do Large Upgrade: Descarregue o pacote "Large Upgrade" oficial do SMF 2.1.x diretamente do site oficial do Simple Machines.
4. Limpeza de Ficheiros Antigos: Apague todos os ficheiros antigos do SMF 2.0 do seu servidor, EXCETO os ficheiros críticos de configuração como o Settings.php, Settings_bak.php, e as pastas de uploads/anexos (attachments, avatars, smileys).
5. Upload dos Novos Ficheiros: Extraia e envie todos os ficheiros do pacote "Large Upgrade" para o servidor, substituindo o que for necessário.
6. Definir Permissões de Escrita: Certifique-se de que os ficheiros Settings.php e Settings_bak.php têm permissões de escrita adequadas (geralmente chmod 644 ou 666, dependendo do ambiente do servidor).
7. Executar o Script de Upgrade: No seu navegador, aceda ao endereço: https://www.oseuforum.com/upgrade.php. Siga as instruções detalhadas exibidas no ecrã para atualizar a estrutura da sua base de dados para o novo padrão.
8. Remover o Ficheiro de Instalação: Por motivos óbvios de segurança, remova o ficheiro upgrade.php do servidor imediatamente após o sucesso da operação.

CONSIDERAÇÕES FINAIS E SEGURANÇA DA SUA COMUNIDADE

Tentar manter um fórum do calibre do SMF 2.0 a correr em sistemas desatualizados é um risco crítico de segurança. Os ataques automatizados que exploram vulnerabilidades em versões antigas de PHP e de software de fóruns são constantes. Ao garantir que o seu sistema corre sob o PHP 8.x e com o SMF 2.1, estará a proteger os dados pessoais dos seus membros e a proporcionar uma experiência de navegação infinitamente mais rápida e agradável.

Se o processo de migração ou a resolução manual de erros fatais de programação lhe parecerem demasiado complexos ou arriscados, recomendamos vivamente que procure o apoio de técnicos especializados em gestão de bases de dados e migrações de software web.

Se após seguir este guia ainda se deparar com o ecrã branco no seu fórum, ou se preferir que uma equipa de engenheiros de sistemas sénior trate de toda a migração, correção de erros de PHP e atualização do seu Simple Machines Forum com total segurança, sem perda de tópicos, membros ou dados históricos, contacte a Aplicsistemas.com. Somos especialistas em infraestruturas web, otimização de bases de dados e resolução imediata de erros críticos de sistemas corporativos e comunitários.