PHP 8

WP_MEMORY_LIMIT no WordPress: resolver memória esgotada no PHP 8.3

A importação morre na metade e o painel cospe “Fatal error: Allowed memory size of 134217728 bytes exhausted”. O processo bateu no teto do PHP. No WordPress esse teto passa por duas constantes diferentes, e mexer na errada não muda nada.

As duas constantes do wp-config.php

Elas precisam ficar acima da linha require_once ABSPATH . 'wp-settings.php';. Depois dela o WordPress já resolveu os padrões e o seu define é ignorado:

define( 'WP_MEMORY_LIMIT', '256M' );     // site todo, padrão 40M
define( 'WP_MAX_MEMORY_LIMIT', '512M' ); // wp-admin e imagens, padrão 256M
                                         // ou o php.ini, se ele já for maior

A primeira vale pro front-end. A segunda é o teto que o wp-admin e o redimensionamento de imagem pedem através de wp_raise_memory_limit(). O detalhe que confunde: o WordPress só sobe o limite, nunca desce. Se o php.ini já está em 512M, declarar 256M não reduz coisa alguma.

Conferir o valor que vale de verdade

Cuidado com o teste pelo WP-CLI: ele roda no SAPI de linha de comando e lê o cli/php.ini, que quase nunca é o mesmo do site. O número que vale pro visitante está no pool do PHP-FPM, e o painel mostra em Ferramentas > Saúde do site > Informações, no campo Limite de memória do PHP.

sudo -u www-data wp eval 'echo ini_get("memory_limit"), PHP_EOL;'  # valor do CLI
grep -ri memory_limit /etc/php/8.3/fpm/pool.d/                      # valor do site

Quando o define é puro enfeite

O WordPress aplica a constante chamando ini_set(). Se o pool trava o valor com php_admin_value, o ini_set falha em silêncio e a constante vira decoração. Troque por php_value[memory_limit] se quiser que o site consiga subir sozinho, e recarregue com sudo systemctl reload php8.3-fpm.

Antes de sair jogando 1G, olhe o que estourou: nove em cada dez vezes é um plugin puxando o catálogo inteiro num WP_Query com posts_per_page em -1. Memória extra compra tempo, não conserta a consulta.

Post Recentes

Converter data dd/mm/aaaa para o MySQL com DateTime::createFromFormat

strtotime com data brasileira devolve false e o INSERT quebra no MySQL 8. Use createFromFormat com getLastErrors antes de mandar…

2 dias atrás

Erro 500 no Magento 2: achar o relatório em var/report pelo ID da tela

O hash que o Magento mostra junto do erro é o nome de um arquivo em var/report. Veja como abrir,…

3 dias atrás

Campo extra no checkout em blocos do WooCommerce sem voltar pro shortcode

Seu snippet com woocommerce_checkout_fields parou de aparecer no checkout em blocos. Registre o campo pela API nova e leia o…

4 dias atrás

Fuso horário no PHP 8.3: log com 3 horas de diferença no servidor

O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…

5 dias atrás

Magento 2 não envia e-mail de pedido: async sending e cron parado

O pedido entra na loja e o e-mail nunca sai: antes de culpar o SMTP, veja o envio assíncrono, a…

5 dias atrás

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

6 dias atrás