...

Carregamento automático do WordPress: Porque é que wp_options torna o seu site mais lento

Carregamento automático do WordPress carrega massas de opções da tabela wp_options na memória com cada pedido de página e, portanto, aumenta os requisitos de TTFB, CPU e RAM. Se demasiados dados carregados automaticamente se acumularem aqui, esta tabela tornará o seu sítio visivelmente mais lento.

Pontos centrais

Vou resumir os factos mais importantes para que possa avaliar imediatamente se as opções de carregamento automático o estão a atrasar. Em cada pedido, o WordPress carrega todas as entradas com autoload=yes, independentemente de serem necessárias. Isto funciona como uma mochila invisível que fica mais pesada com cada plugin instalado. A partir de um tamanho de autoload de cerca de 1 MB, o desempenho cai rapidamente, o que é particularmente notório em hosts mais pequenos. Com alguns passos específicos, posso reduzir permanentemente a carga e manter o wp_options limpo.

  • Carga automáticaTudo o que tem autoload=yes é guardado com cada pedido de página.
  • Tamanho críticoTTFB aumenta acentuadamente a partir de ~1 MB; 2-3 MB é considerado um intervalo de alarme.
  • Condutor principalPlugins, transientes, registos e tarefas cron com defeito.
  • MediçãoO SQL/WP-CLI mostra imediatamente o tamanho e o principal originador.
  • soluçãoLimpar, carregar automaticamente para „não“, subcontratar, verificar regularmente.

Porque é que o carregamento automático é mais lento

As opções carregadas automaticamente acabam na memória com cada pedido, independentemente de a página precisar delas; é exatamente isto que consome memória. Recursos. Pequenos valores são quase imperceptíveis, mas com muitos plugins o total cresce rapidamente para centenas de kilobytes ou mesmo vários megabytes. A partir de cerca de 1 MB, vejo regularmente um aumento do TTFB, páginas de administração mais lentas e mais picos de CPU. No alojamento partilhado, a carga multiplica-se porque os pedidos paralelos aumentam o base de dados wordpress adicionalmente. Quanto maior for o bloco de carregamento automático, mais demorada é a desserialização e mais tempo o seu servidor perde antes do primeiro byte.

Como é que o WordPress carrega internamente (alloptions e cache de objectos)

O WordPress combina todas as opções carregadas automaticamente num grande bloco. Com o primeiro pedido, este bloco é carregado com uma única consulta e armazenado sob a chave colectiva todas as opções é armazenado na cache de objectos. Isto reduz o número de consultas à base de dados, mas não a quantidade de dados a processar: O bloco inteiro deve ser desserializado e mantido na memória. Com um Cache de objectos persistentes (por exemplo, Redis ou Memcached), a carga da base de dados desaparece, mas os processos PHP ainda têm que descompactar os dados e mantê-los na RAM. Isso significa que um grande bloco de carregamento automático também é prejudicial se os dados vierem do cache - apenas o gargalo muda do banco de dados para a CPU e a RAM.

Isto é particularmente crítico no caso de:

  • elevado paralelismo (muitos pedidos simultâneos): Cada PHP worker carrega o bloco separadamente.
  • tempos de processamento curtos (FPM/Serverless): A sobrecarga é incorrida novamente para cada novo processo.
  • Área de administração e cronAs caches são contornadas ou invalidadas com mais frequência, o bloco de carregamento automático conta sempre.

Como encontrar os maiores infractores do carregamento automático

Começo com uma medida de tamanho diretamente na wp_options. Obtenho a soma através de SQL: SELECT SUM(LENGTH(option_value)) AS autoload_size FROM wp_options WHERE autoload = 'yes';. Os valores superiores a 1 MB são críticos, a partir de 2-3 MB torna-se perigoso, especialmente com tráfego. De seguida, ordeno por tamanho: SELECT option_name, LENGTH(option_value) AS bytes FROM wp_options WHERE autoload = 'yes' ORDER BY bytes DESC LIMIT 20;. É assim que identifico as matrizes grandes, antigas Transientes e entradas de plugins que muitas vezes não precisam de ser carregadas automaticamente; uma breve Instruções passo a passo ajuda a avaliar os resultados de forma fiável.

Diagnóstico avançado: contagem, agrupamento, reconhecimento de padrões

Para além do tamanho total, verifico também o número e a origem das entradas:

  • Número de opções carregadas automaticamente: SELECT COUNT(*) FROM wp_options WHERE autoload='yes';
  • Top namespaces (heuristicamente através de prefixos): SELECT SUBSTRING_INDEX(nome_da_opção,'_',1) AS ns, COUNT(*) AS cnt, SUM(LENGTH(valor_da_opção)) AS bytes FROM wp_options WHERE autoload='yes' GROUP BY ns ORDER BY bytes DESC LIMIT 10;
  • Transientes que são falsamente carregados automaticamente: SELECT option_name FROM wp_options WHERE autoload='yes' AND option_name LIKE '_transient_%' ESCAPE '';

Utilizo estas consultas para encontrar rapidamente caches de estatísticas, artefactos de construtores de páginas ou restos de registos, por exemplo. Muitas vezes, os padrões são claramente reconhecíveis: vários milhares de pequenas entradas de um plugin de análise ou algumas matrizes muito grandes de um construtor.

Valores-limite e medidas

Para uma avaliação rápida, utilizo limiares fixos e utilizo-os para organizar a próxima Passos desligado. Isto permite-me tomar decisões sem perder tempo com intuições. A tabela ajuda na categorização e oferece opções claras de ação em cada área. Mantenho-me fiel a ela porque funciona de forma fiável em muitos projectos. Especialmente quando os recursos são escassos Clareza em menos de um minuto.

Tamanho do carregamento automático Risco Medida recomendada
0-500 KB baixo Estado do documento, verificar ocasionalmente
500 KB-1 MB médio Verificar as entradas maiores, eliminar as desnecessárias
> 1 MB elevado Identificar originador de topo, sinalizador de carregamento automático definido para „não“
> 2-3 MB Crítico Limpeza sistemática, remover transientes

Limpeza segura: passo a passo

Faço uma cópia de segurança da base de dados antes de cada alteração, porque uma cópia de segurança completa protege-me de Erros. Com o WP-CLI é rápido e fácil: exportação wp db. Elimino os transientes expirados: wp transient delete --expired e, se necessário, todos eles: wp transient delete --all. Removo especificamente as opções de plug-in órfãs, por exemplo, com wp option delete my_plugin_option. Para entradas grandes que não precisam de ser carregadas automaticamente, implemento o sinalizador: wp option update nome_da_opção 'valor' --autoload=no; depois verifico o frontend e o Backend completamente.

Rede de segurança, testes e retrocesso

Após cada alteração, verifico estas áreas pela seguinte ordem: página inicial (como convidado), uma subpágina profunda, início de sessão/encerramento de sessão, painel de controlo do administrador e gravação de uma publicação. Também acciono o Cron: wp cron event run --due-now e verifico o registo de erros. Se algo se avariar, reinicio especificamente: wp option update nome_da_opção 'valor' --autoload=yes ou definir a cópia de segurança. Para matrizes grandes, exporto o seu conteúdo antecipadamente com wp option get option_name > backup.json, Posso restaurá-lo em qualquer altura.

O que não defino como „autoload=no“

O WordPress utiliza algumas opções muito cedo no bootstrap ou em cada processamento de pedido. Não altero cegamente o seu sinalizador de carregamento automático, mesmo que sejam grandes:

  • siteurl, homeURLs básicos, necessários desde cedo.
  • permalink_structure, rewrite_rulesEssencial para a resolução de pedidos; se não estiverem em todas as opções, Seguem-se outros êxitos da base de dados.
  • modelo, folha de estiloDeterminação do tema.
  • blog_charset, timezone_string e outras predefinições essenciais.

Regra básica: deixo as opções principais e as que são utilizadas em quase todos os pedidos serem carregadas automaticamente. Concentro-me em entradas de plugins grandes e raramente utilizadas, artefactos de cache, registos e transientes antigos.

Quando as opções devem permanecer grandes

Alguns dados podem ser grandes, mas não precisam de ser armazenados na memória para cada pedido. terra. Para configurações extensas, utilizo as minhas próprias tabelas em vez de wp_options; isto mantém a quantidade de autoload reduzida. A informação relacionada com o utilizador pertence à meta do utilizador, não às opções globais. Guardo conteúdo estático, como longas cadeias de CSS/JS, como um ficheiro e carrego-o especificamente. Ao guardar, defino o carregamento automático diretamente para „não“, por exemplo com add_option('name', $data, '', 'no');, para evitar Carregamento a evitar.

Guia do programador: Padrões que escalam

Como programador, evito enormes „mega-opções“ que reúnem tudo num array. Um conjunto restrito (autoload=sim) mais cargas preguiçosas direcionadas (autoload=não) é melhor. Padrões práticos:

  • Opções de divisão: meu núcleo_de_plugin (pequeno, carregamento automático=sim) e minha_cache_de_plugin_* (grande, carregamento automático=não).
  • Armazenamento em cache direcionado: Subconjuntos frequentemente necessários com wp_cache_set() em vez de ter grandes opções carregadas automaticamente.
  • Utilizar corretamente os transientesPor predefinição, não guardar o carregamento automático e recuperar conscientemente; apenas os transientes muito pequenos e frequentemente utilizados são carregados automaticamente.
  • Parar o crescimento das opçõesNão armazenar logs ou caches ilimitados nas opções; aplicar tamanho máximo e TTL.

Prevenção em vez de reparação

Mantenho os meus plug-ins reduzidos e desativo tudo o que não tem um benefício claro, por isso o bloco de carregamento automático mantém-se pequeno. Uma vez por mês, verifico o tamanho com SQL ou WP-CLI e documento os valores. Em Ferramentas > Estado do sítio Web, controlo as notas sobre as opções carregadas automaticamente. Para sites com muito tráfego, vale a pena utilizar um alojamento que optimize o base de dados wordpress de forma eficiente e mantém o wp_options limpo. Uma coleção de Estratégias de afinação ajuda-me a reconhecer os problemas numa fase inicial e a evitar que se tornem graves.

Automatização: pequenos empregos, grande impacto

Programo uma limpeza regular. Um cron job noturno (ou um cron do servidor que executa o WP-CLI) remove os transientes expirados e regista o tamanho do carregamento automático num ficheiro ou tabela. Isto permite-me ver as tendências antes de os utilizadores darem por elas. Exemplo de processo (simplificado):

wp transient delete --expired
wp db query "SELECT NOW(), SUM(LENGTH(option_value)) FROM wp_options WHERE autoload='yes';" >> autoload_stats.log

Um pequeno controlo de saúde que guarde as 10 entradas principais com a data é conveniente. Um olhar sobre o registo é suficiente para atribuir os valores atípicos a um momento específico - normalmente após uma atualização de um plugin ou uma nova função.

Exemplo prático: limpeza de 60 minutos

Num projeto, encontrei 5.500 opções carregadas automaticamente, totalizando cerca de 2 MB; a página devolveu o primeiro byte após cerca de 1.900 ms. Após a cópia de segurança, a eliminação transitória, a verificação do top 20 e os ajustes de sinalização, o tempo de carregamento foi reduzido para metade, para cerca de 500 ms. A utilização da CPU baixou de 89 % para cerca de 2,5 %, e o backend respondeu significativamente mais depressa. O procedimento foi simples: medir, limpar, testar, documentar. Esta é exatamente a rotina que utilizo regularmente para monitorizar o crescimento do wp_options permanentemente.

Causas e correcções típicas

Os construtores de páginas gostam de escrever grandes matrizes de cache em opções que eu prefiro escrever em ficheiros. descartar. Guardo as estatísticas como transientes carregados de forma não automática e recupero-as especificamente. Os registos devem estar em ficheiros rotativos, não em wp_options. Trabalhos cron falhados causam transientes antigos; aqui eu ajusto os intervalos e timeouts. Estas simples alterações reduzem rapidamente a quantidade de carregamentos automáticos e mantêm-nos estáveis a longo prazo estável.

Influência das caches, do FPC e do alojamento

Uma cache de página inteira (FPC) a montante protege principalmente os visitantes anónimos. No entanto, sempre que a cache é contornada - utilizadores com sessão iniciada, cesto de compras, checkout, administração, cron, WP-CLI - o bloco de carregamento automático tem efeito total. Um servidor de base de dados rápido esconde a carga de E/S, mas o tempo de CPU para a desserialização e o consumo de RAM mantêm-se. Especialmente em instâncias pequenas com poucos trabalhadores FPM, um grande bloco de carregamento automático leva a filas e timeouts, mesmo que os dados venham „do cache“. O objetivo é, portanto, manter sempre o bloco pequeno e não apenas tornar a fonte mais rápida.

Acompanhamento e números-chave

Acompanho o TTFB, o First Contentful Paint e o tempo de carregamento do backend antes e depois de cada Limpeza. Ao mesmo tempo, documentei o tamanho do carregamento automático, o número de opções carregadas automaticamente e as entradas maiores. Uma pequena folha com a data, o tamanho e o TTFB é suficiente para identificar tendências claras. Para a manutenção, utilizo consultas SQL mensais e uma breve Atualizar a base de dados-lista de controlo. Isto permite-me reconhecer precocemente os casos anómalos e manter a base de dados wordpress permanentemente magro.

Multisite: Dois estaleiros de construção num piscar de olhos

Nas configurações de vários sítios, existe carga de carregamento automático tanto por sítio como a nível da rede. Por conseguinte, verifico o wp_options de cada sítio (prefixo de tabela por blogue) e, adicionalmente, as opções de rede. As matrizes grandes e utilizadas globalmente afectam todos os sítios. Proceder como na configuração única: medir, identificar as entradas principais, externalizar os valores grandes ou mudar para autoload=não se não forem necessários para cada pedido. A redução é imediatamente percetível, especialmente no administrador da rede.

Mal-entendidos frequentes - brevemente esclarecidos

  • „O Redis resolve o problema“.“ Reduz as consultas de BD, mas não o tamanho do bloco de carregamento automático. Os custos de CPU e RAM permanecem.
  • „O FPC torna o carregamento automático irrelevante.“ Não para os utilizadores com sessão iniciada, Cron e Admin. A vantagem do FPC não se aplica a estes utilizadores.
  • „Apagar todos os transientes é perigoso.“ É seguro, mas apenas conduz a uma nova acumulação. Utilizar de forma orientada e planeada.
  • „Um bloco grande é suficiente se houver poucas entradas.“ A soma dos bytes e da desserialização é decisiva, não o número por si só.

Plano de teste após a limpeza

  • Extremidade dianteiraPágina inicial, arquivo aleatório e página de detalhes, como convidado e utilizador com sessão iniciada.
  • FunçõesPesquisa, formulário de contacto, cesto de compras/checkout (se for uma loja).
  • AdministradorPainel de controlo, lista de publicações, guardar uma publicação/produto, página do plugin.
  • ContextoExecutar eventos cron programados, verificar o registo de erros, medir aleatoriamente o TTFB.

Resumo para decisões rápidas

As opções de carregamento automático são um assassino silencioso do desempenho, que posso eliminar com alguns passos claros. captura. Meço o tamanho, removo os transientes antigos, defino as entradas desnecessárias como autoload=no e externalizo os dados de grande dimensão. Em seguida, testo o frontend e o backend e anoto os pontos de medição. Com uma hora de trabalho concentrado, reduzo frequentemente a carga de carregamento automático em 30-70 % e reduzo para metade os tempos de carregamento. Se repetir esta rotina todos os meses, pode manter o wp_options rápido e o sítio é visivelmente reativo.

Artigos actuais

Bastidor de servidor com painel de controlo WordPress para tarefas programadas num ambiente de alojamento moderno
Wordpress

Porque é que o WP-Cron pode ser problemático para sites WordPress produtivos

Descubra por que razão o problema do WP cron conduz a problemas de desempenho e fiabilidade em sítios WordPress produtivos e como pode criar uma alternativa profissional com cronjobs do sistema. Foco no problema do WP cron, tarefas agendadas do Wordpress e problemas de desempenho do WP.