A maioria dos problemas de desempenho em WordPress costuma ser atribuída ao ambiente de hospedagem, o que às vezes está correto. No entanto, dependências de terceiros podem acionar os mesmos sinais de alerta, mesmo estando fora do controle da hospedagem.

Gateways de pagamento com atraso, APIs de envio que não respondem e scripts de análise lentos são falhas para as quais você só pode aplicar medidas de contenção. Ainda assim, isso depende da sua infraestrutura de hospedagem e do que pode ser feito no nível da aplicação para manter o site funcionando quando essas dependências falham.

Por que dependências de terceiros criam falhas em cascata no WordPress

Um site WordPress moderno raramente funciona de forma isolada. Por exemplo, considere do que depende um fluxo de checkout no WooCommerce em um determinado momento:

  • Os gateways de pagamento processam a transação.
  • APIs de envio calculam tarifas em tempo real.
  • Serviços de impostos cuidam da conformidade.

Outros sites podem carregar um crawler de análises, um script de sincronização com CRM, um widget de chat em tempo real e muitas outras dependências, cada uma hospedada em um servidor externo diferente.

Quando qualquer uma dessas dependências fica lenta ou para de responder, o efeito não se limita a essa funcionalidade específica. Em vez disso, ele se propaga pela camada de execução do PHP e cria um problema que pode afetar todo o site. Isso acontece porque, quando o WordPress serve uma página que depende de uma resposta de API externa, uma thread fica aguardando antes de concluir a solicitação.

Assim, um gateway de pagamento que expira após 30 segundos ocupa uma thread durante todo esse tempo e não pode processar mais nada nesse intervalo. Se vários visitantes acessarem esse checkout lento ao mesmo tempo, várias threads podem atrasar o carregamento das páginas para todas as solicitações em andamento. Em hospedagem compartilhada, os sites compartilham um pool de threads.

A lacuna de visibilidade: problemas de desempenho internos e externos

Dessa forma, não são necessários muitos timeouts simultâneos para esgotar totalmente um pool compartilhado. Quando isso acontece, a API externa atinge o tempo limite e os visitantes restantes recebem erros relacionados ao tempo limite, como 502 ou 504, enquanto aguardam uma thread disponível.

No entanto, um erro 504 parece exatamente o mesmo independentemente da sua origem. Para esse tipo de resposta de erro, normalmente você investiga primeiro CPU, memória e métricas de infraestrutura. Isso pode dar a impressão de que a hospedagem é o problema, mesmo quando a causa real é uma dependência externa.

Como a arquitetura de contêineres da Kinsta limita o impacto de falhas de terceiros

A Kinsta executa cada site WordPress em seu próprio contêiner isolado, o que define o “raio de impacto” quando um serviço de terceiros falha.

Cada contêiner possui seu próprio pool dedicado de threads PHP, que não pode ser acessado por outros sites na plataforma. Isso significa que o esgotamento de threads PHP fica restrito ao seu contêiner, sem afetar outros sites na mesma infraestrutura. Além disso, quando chamadas de API externas ocupam todas as threads PHP do seu contêiner, as requisições recebidas entram em fila no Nginx e no PHP-FPM, em vez de retornarem erros imediatamente.

Na prática, uma falha em um gateway de pagamento que derrubaria todos os sites em um servidor compartilhado afeta apenas o seu contêiner na Kinsta. O pool de threads dentro do seu contêiner fica sob pressão, mas os sites vizinhos permanecem completamente inalterados.

Limites de timeout evitam bloqueios indefinidos

Sem controle, uma thread PHP poderia manter uma conexão com uma API externa com falha por um período prolongado. Para evitar isso, a Kinsta define o max_execution_time com um valor padrão de 300 segundos, limitando por quanto tempo um script PHP pode ser executado ativamente.

Há também um timeout HTTP separado que determina quando a conexão entre navegador e servidor é encerrada e retorna um erro 504 ao visitante — na Kinsta, isso ocorre após 180 segundos.

Juntos, esses limites garantem que o pior cenário tenha um ponto final definido do ponto de vista do visitante. No entanto, nenhum dos dois limites interrompe de forma confiável, por si só, uma chamada de API externa bloqueada. No Linux, o tempo de execução do PHP não contabiliza o tempo gasto aguardando operações de stream, como ocorre em uma solicitação HTTP de saída feita pela API HTTP do WordPress.

Uma thread bloqueada aguardando a resposta de um gateway de pagamento praticamente não acumula tempo de execução sob a perspectiva do PHP, o que faz com que o limite de 300 segundos ofereça menos proteção do que aparenta. Por isso, definir timeouts explícitos dentro dos plugins, por meio de http_request_timeout, é a forma mais confiável de encerrar chamadas externas travadas no nível do aplicativo.

Quando uma solicitação atinge o timeout, a thread é liberada, e o contêiner inicia um processo de recuperação que normalmente leva alguns minutos.

Usando o APM da Kinsta para diferenciar gargalos da hospedagem e de terceiros

A ferramenta APM da Kinsta captura dados com registro de data e hora de processos PHP, consultas MySQL e chamadas HTTP externas. É a maneira de monitorar a diferença de desempenho entre sua hospedagem e as dependências de terceiros.

A interface da ferramenta Kinsta APM no painel MyKinsta, mostrando o botão Enable APM e elementos relacionados.
A interface da ferramenta APM da Kinsta no painel MyKinsta.

Você pode habilitar o APM na seção APM do MyKinsta e escolher uma janela de monitoramento entre quatro opções predefinidas, variando de duas a 24 horas. Como o Kinsta APM utiliza recursos adicionais do servidor, o ideal é ativá-lo quando você suspeitar que há um problema ou quando ele puder ser reproduzido.

Depois que o APM estiver em execução, você poderá visualizar diversos gráficos e métricas distribuídos em quatro seções: Transações, WordPress, Banco de dados e Externo. A última é fundamental para que você entenda onde ocorrem os gargalos.

Usando a aba Externo no APM da Kinsta

A guia Externo lista todas as solicitações HTTP externas que seu site faz, incluindo chamadas iniciadas por plugins e temas para processamento de pagamentos, cálculos de envio, integrações de CRM e análises. Cada entrada mostra as durações total, máxima e média, juntamente com a taxa de solicitações por minuto.

Usando a aba Externa no Kinsta APM
A aba Externo no APM da Kinsta mostra as solicitações HTTP externas.

Por exemplo, se uma API de pagamento aparece no topo da lista com uma duração máxima medida em vários segundos, isso indica claramente que o gateway é a origem do problema.

Rastreamento de transações

Ao clicar em uma URL de solicitação na aba Externo, é aberta uma lista de amostras de transações. Ao selecionar uma amostra específica, a timeline de rastreamento da transação é exibida, mostrando uma análise completa de todos os processos que ocorreram, com cada processo apresentado como um intervalo de tempo.

Intervalos que consomem mais de 5% do tempo total da transação aparecem em laranja; aqueles que consomem mais de 25% aparecem em vermelho.

A timeline de rastreamento de transações na ferramenta APM da Kinsta, exibindo uma lista de intervalos com colunas de duração, URL e timestamp. Um dos intervalos está destacado em vermelho.
A timeline de rastreamento de transações na ferramenta APM da Kinsta.

Os rastreamentos ajudam você a priorizar quais dependências devem ser otimizadas ou substituídas primeiro. Por exemplo, se uma chamada HTTP externa para uma API de pagamento ocupa cinco segundos de uma transação total de 5,5 segundos, a infraestrutura de hospedagem processou todo o restante em meio segundo.

Para usar o Kinsta APM durante a investigação de um problema, o fluxo de trabalho é o seguinte:

  • Habilite o monitoramento APM e selecione uma duração que cubra o período do problema.
  • Reproduza o problema, caso ele não esteja ocorrendo no momento (ou aguarde a ferramenta capturar dados em tempo real).
  • Aguarde a coleta de dados, depois acesse a aba Externo, clique em uma solicitação externa para abrir o rastreamento da transação e analise a duração dos intervalos.

Se chamadas HTTP externas aparecerem no topo dos resultados com durações que representam a maior parte do tempo da transação, você já tem as informações necessárias para começar a corrigir o problema.

Estratégias operacionais para gerenciar dependências de terceiros

O isolamento por contêiner limita o impacto de falhas externas, mas a forma como você carrega e consome serviços externos também faz diferença. Mesmo com uma hospedagem bem estruturada, dependências de terceiros exigem gerenciamento proativo no nível do aplicativo.

Padrões de carregamento assíncrono para scripts não críticos

Por padrão, o WordPress carrega scripts de forma síncrona, o que significa que um script no cabeçalho do documento impede que o navegador exiba o conteúdo até que o download e a execução sejam concluídos. Para scripts analíticos, ferramentas de mapeamento de calor e automação de marketing, isso significa que um servidor de terceiros lento atrasa toda a sua página.

A diferença que você deve entender aqui é que o carregamento por meio de sync e async produzem resultados diferentes quando um servidor externo está lento:

  • O carregamento síncrono (bloqueio) interrompe a análise de HTML até que o script seja baixado e executado. Se o servidor externo estiver sob carga, sua página fica aguardando.
  • O carregamento assíncrono permite que o navegador continue analisando o HTML e renderizando o conteúdo enquanto o script é carregado em segundo plano. Se o servidor externo estiver lento, sua página será renderizada mesmo assim.

O WordPress tem suporte nativo para estratégias de carregamento async e defer por meio do wp_enqueue_script(). Ambas evitam que scripts não críticos bloqueiem a renderização da página, mas se comportam de forma diferente: defer executa scripts em ordem (ideal para scripts com dependências), enquanto async executa scripts assim que são carregados, independentemente da ordem.

O uso do async é ideal para scripts independentes em que a ordem de execução não importa.

add_action( 'wp_enqueue_scripts', function() {
    // Analytics — deferred so it doesn't block the critical path.
    wp_enqueue_script(
        'google-analytics',
        'https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXX',
        [],
        null,
        [ 'strategy' => 'defer', 'in_footer' => false ]
    );

    // Marketing script — async because execution order doesn't matter.
    wp_enqueue_script(
        'hotjar',
        'https://static.hotjar.com/c/hotjar-XXXXXX.js',
        [],
        null,
        [ 'strategy' => 'async', 'in_footer' => false ]
    );
} );

No entanto, os scripts críticos para o checkout geralmente precisam de um comportamento de carregamento mais cuidadoso do que as tags de análise ou marketing, e algumas integrações de pagamento podem precisar permanecer bloqueadas ou ordenadas para evitar a interrupção do checkout. Em resumo, os scripts não críticos que podem falhar sem interromper a página são async ou defer; já scripts essenciais para concluir uma transação não devem usar essas estratégias.

Configuração de timeout para chamadas de API externas

O max_execution_time padrão da Kinsta é suficiente para operações complexas, mas longo demais para manter um usuário esperando. Por isso, plugins que fazem chamadas a APIs externas devem definir seus próprios limites de timeout, em vez de depender do limite do servidor.

O WordPress utiliza, por padrão, um timeout HTTP de 5 segundos para requisições externas, a menos que um plugin ou filtro o altere. Caso um plugin precise de um limite diferente, o WordPress fornece o filtro http_request_timeout. Ele é executado antes da solicitação e recebe tanto o valor atual de timeout quanto a URL de destino, permitindo definir limites diferentes para serviços distintos:

add_filter( 'http_request_timeout', function( $timeout, $url ) {
    se ( str_contains( $url, 'api.example.com' ) ) {
        return 10; // Don't wait longer than 10 seconds.
    }
    return $timeout;
}, 10, 2 );

Esse tipo de limite garante que um serviço com falha retorne um erro rapidamente ao usuário, em vez de ocupar uma thread PHP por muito tempo. Manter timeouts no nível de plugin bem abaixo do limite do servidor é o que evita que uma única API lenta consuma uma thread por um período excessivo.

No entanto, aumentar valores de timeout não corrige APIs lentas; apenas evita falhas prematuras quando o serviço está funcional, mas sob carga. A abordagem correta é usar um timeout curto, que falhe rapidamente e acione um mecanismo de fallback.

Mecanismos de fallback e degradação gradual

Os fallbacks mantêm seu site funcional durante falhas externas em vez de exibir um erro. O padrão usa transientes do WordPress para armazenar em cache as respostas bem-sucedidas da API e, em seguida, fornece dados armazenados em cache quando uma chamada em tempo real falha.

Aqui está um exemplo:

function get_shipping_rates_with_fallback( $package ) {
    $cache_key  = 'live_shipping_rates_' . md5( serialize( $package ) );
    $backup_key = 'backup_shipping_rates_' . md5( serialize( $package ) );
    // Return fresh cached rates if they're available.
    $cached = get_transient( $cache_key );
    if ( $cached !== false ) {
        return $cached;
    }
    // Attempt the live API call with a short timeout.
    $response = wp_remote_post( 'https://api.example.com/rates', [
        'timeout' => 8,
        'body'    => [
            'destination' => $package['destination'],
            'weight'      => $package['contents_weight'],
        ],
    ] );
    // On success: cache the result and update the longer-lived backup.
    if ( ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) === 200 ) {
        $rates = json_decode( wp_remote_retrieve_body( $response ), true );
        set_transient( $cache_key, $rates, HOUR_IN_SECONDS );
        set_transient( $backup_key, $rates, DAY_IN_SECONDS );
        return $rates;
    }

    // On failure: serve stale backup rates rather than an error.
    $backup = get_transient( $backup_key );
    if ( $backup !== false ) {
        return $backup;
    }
    // No cached data at all: return a flat-rate fallback.
    return [
        [ 'id' => 'fallback_flat', 'label' => 'Standard Shipping', 'cost' => 9.99 ],
    ];
}

O transiente de uma hora lida com o cache normal para impedir chamadas desnecessárias à API. O transiente de 24 horas é atualizado somente quando a API ativa retorna uma resposta bem-sucedida, o que permite que seu site volte para a resposta bem-sucedida mais recente. Quando a API fica inativa, seu site exibe as tarifas de envio anteriores em vez de um erro.

A degradação gradual mantém a funcionalidade principal do seu site ativa mesmo quando serviços externos estão indisponíveis. Ela funciona melhor em conjunto com uma infraestrutura de hospedagem que limita falhas ao nível do contêiner, evitando que um problema em uma dependência consuma recursos.

Sua hospedagem deve fazer mais do que apenas oferecer velocidade

As falhas de terceiros fazem parte da execução de um site WordPress com dependências do mundo real. O que você pode controlar é o impacto dessas falhas no seu site, o que depende de como seu ambiente de hospedagem responde.

Utilizar uma infraestrutura que implemente isolamento por contêiner, pool dedicado de threads PHP, limites de timeout integrados e monitoramento de aplicativos permite diferenciar problemas de hospedagem de problemas causados por dependências externas.

Se você quer ver como a infraestrutura da Kinsta lida com isso em seus sites WordPress, explore os planos de hospedagem da Kinsta. Ou fale com a nossa equipe para entender como a Kinsta pode beneficiar sua configuração específica.

Joel Olawanle Kinsta

Joel é um desenvolvedor Frontend que trabalha na Kinsta como Editor Técnico. Ele é um professor apaixonado com amor pelo código aberto e já escreveu mais de 200 artigos técnicos, principalmente sobre JavaScript e seus frameworks.