max_input_vars e max_input_time: resolvendo formulários que não salvam

Se um menu do WordPress some ao salvar, as opções de um tema não gravam, ou um formulário grande envia os dados pela metade — sem nenhuma mensagem de erro —, a causa provável é o max_input_vars: o PHP está descartando silenciosamente as variáveis que passam de um certo limite. É um dos problemas mais confusos justamente por não dar erro nenhum.

O max_input_vars controla quantas variáveis o PHP aceita em uma única requisição; o max_input_time, seu parente próximo, controla quanto tempo o PHP gasta processando esses dados. As duas diretivas do php.ini atuam sobre o mesmo ponto — o envio de formulários grandes — e este guia explica o que cada uma faz, por que causam esses sintomas e como ajustá-las.

Resposta rápida

O max_input_vars define o número máximo de variáveis que o PHP aceita numa requisição (padrão: 1000). Se um formulário ou menu envia mais que isso, o PHP descarta o excedente sem avisar — por isso menus e opções do WordPress “somem” ao salvar. A solução é aumentar o valor (para 3000 ou 5000) no php.ini, no .htaccess ou pelo painel. O max_input_time controla o tempo de processamento desses dados; se formulários grandes falham por demora, aumente-o também.

O que é o max_input_vars

O max_input_vars é a diretiva do PHP que limita o número de variáveis de entrada que o servidor aceita em uma única requisição. Isso vale para os dados enviados por POST, GET e cookies somados.

O valor padrão é 1000. Na maioria dos sites, isso é mais que suficiente. Mas há um comportamento que torna essa diretiva traiçoeira: quando o limite é ultrapassado, o PHP não gera erro — ele simplesmente descarta as variáveis além do limite. A requisição continua, aparentemente com sucesso, mas com parte dos dados faltando.

É essa “falha silenciosa” que confunde. Você salva uma configuração, o site diz que salvou, mas metade dos dados não foi gravada — e não há mensagem nenhuma explicando o porquê.

Os sintomas: quando suspeitar do max_input_vars

O max_input_vars é especialmente comum em sites WordPress, porque page builders, temas complexos e plugins robustos geram muitos campos de uma vez. Os sintomas típicos:

  • Itens de menu somem depois de salvar um menu grande no WordPress.
  • Opções de tema ou do customizer não gravam — você salva, mas voltam ao valor anterior.
  • Formulários longos enviam dados incompletos, perdendo os campos finais.
  • Configurações de plugins pesados (páginas com dezenas ou centenas de campos) não persistem.

O padrão comum a todos: os primeiros dados são salvos, os últimos não — porque o PHP processa até o limite e descarta o resto. Se você percebe que “só o final do formulário se perde”, o max_input_vars é o suspeito número um.

Como verificar o valor atual

Antes de mudar, confirme o valor em vigor. Crie um arquivo com phpinfo() e procure por max_input_vars, ou consulte pelo painel. O guia do php.ini mostra como localizar e ler essas configurações. Se o valor estiver em 1000 (o padrão) e você tem um formulário grande falhando, é sinal de que precisa aumentá-lo.

Como aumentar o max_input_vars

Assim como outras diretivas do PHP, há mais de um caminho, dependendo do seu acesso.

No php.ini (ou pelo painel)

O caminho mais direto. No php.ini, ajuste:

max_input_vars = 3000

Em hospedagem compartilhada, faça isso pelo painel — no cPanel, em Select PHP Version → Options, localizando max_input_vars. Um valor de 3000 resolve a grande maioria dos casos; sites muito complexos podem precisar de 5000.

No .htaccess

Em servidor Apache, pelo .htaccess na raiz do site:

php_value max_input_vars 3000

Se essa linha gerar um erro 500, o servidor não aceita php_value no .htaccess (comum em PHP-FPM) — use então o php.ini ou o painel.

Criando um php.ini próprio

Se você não tem acesso ao php.ini global, pode criar um arquivo php.ini (ou .user.ini) na raiz do site com a linha max_input_vars = 3000. O guia do php.ini detalha esse método.

⚠️ Não exagere no valor

Aumente o max_input_vars para o que o seu site precisa (3000 ou 5000 costumam bastar), não para um número gigante. Um limite muito alto abre espaço para que uma requisição maliciosa envie um volume enorme de variáveis e consuma memória do servidor. O limite existe também como proteção — eleve-o com critério, na medida da sua necessidade.

O max_input_time: o parente próximo

O max_input_time controla quanto tempo (em segundos) o PHP pode gastar analisando os dados de entrada de uma requisição — o POST, o GET e os uploads. É diferente do max_execution_time, que mede o tempo de execução do script; o max_input_time mede só a fase de leitura da entrada.

Enquanto o max_input_vars limita a quantidade de variáveis, o max_input_time limita o tempo de processá-las. Os dois se relacionam porque um formulário muito grande pode esbarrar em ambos: ter variáveis demais (max_input_vars) e demorar demais para ser lido (max_input_time).

O valor padrão costuma ser 60 segundos (ou -1, que faz o PHP usar o max_execution_time). Se você tem formulários enormes, uploads pesados combinados com muitos campos, ou um checkout complexo que falha por tempo, vale aumentá-lo:

max_input_time = 120

Ajusta-se pelos mesmos caminhos do max_input_vars: php.ini, .htaccess (php_value max_input_time 120) ou painel. Na prática, o max_input_vars é a causa da maioria dos problemas de “formulário não salva”; o max_input_time entra quando o volume de dados é grande o bastante para a leitura demorar.

Ativei e ainda não funciona? Verifique

Se você aumentou o max_input_vars e o problema persiste:

  • Confirme que o novo valor está ativo: use o phpinfo() e procure max_input_vars — se ainda mostra 1000, a mudança não pegou (arquivo errado, ou faltou reiniciar num VPS).
  • O gargalo pode ser outra diretiva: se o formulário também envia muitos dados em volume (não só em quantidade de campos), o post_max_size pode ser o limite real. Verifique-o também.
  • Editou o php.ini certo? Em cPanel, o php.ini ativo costuma ficar na home do usuário, não na raiz do WordPress. O phpinfo() mostra qual arquivo está em uso.
  • ini_set não resolve este caso: o max_input_vars não pode ser alterado por ini_set() no código, porque o PHP já processou a entrada antes de o script rodar. Use php.ini, .htaccess ou painel — nunca o código.

Esse último ponto é importante e pouca gente sabe: diferente do display_errors ou do memory_limit, o max_input_vars não funciona via ini_set(), porque quando o seu script começa a rodar, a entrada já foi lida (e truncada). Tem de ser definido antes, na configuração.

Perguntas frequentes

O que é o max_input_vars no PHP?
É a diretiva que define o número máximo de variáveis de entrada que o PHP aceita em uma única requisição, somando POST, GET e cookies. O valor padrão é 1000. Quando uma requisição ultrapassa esse limite, o PHP descarta as variáveis excedentes sem gerar erro, o que causa perda silenciosa de dados em formulários e menus grandes.

Por que meu menu ou formulário do WordPress não salva tudo?
A causa mais comum é o max_input_vars. Menus grandes, page builders, temas complexos e plugins com muitos campos podem gerar mais de 1000 variáveis numa requisição. Ao ultrapassar o limite, o PHP descarta o excedente silenciosamente, então parte dos itens ou opções não é salva. Aumentar o max_input_vars para 3000 costuma resolver.

Como aumentar o max_input_vars?
Defina um valor maior no php.ini (max_input_vars = 3000), no .htaccess em Apache (php_value max_input_vars 3000), ou pelo painel de hospedagem (no cPanel, em Select PHP Version → Options). Em hospedagem compartilhada, o painel é o caminho mais simples. Depois, confirme com phpinfo que o novo valor está ativo.

Qual a diferença entre max_input_vars e max_input_time?
O max_input_vars limita a quantidade de variáveis de entrada numa requisição; o max_input_time limita o tempo (em segundos) que o PHP gasta lendo esses dados. Um trata do “quantos campos”, o outro do “quanto tempo para processá-los”. Formulários muito grandes podem esbarrar nos dois.

Posso alterar o max_input_vars pelo ini_set no código?
Não. Diferente de outras diretivas, o max_input_vars não pode ser alterado por ini_set(), porque o PHP processa os dados de entrada antes de o seu script começar a rodar. Quando o código executa, a entrada já foi lida e truncada. Por isso, é preciso definir o valor no php.ini, no .htaccess ou no painel.

Qual valor devo usar para o max_input_vars?
Depende do tamanho dos seus formulários, mas 3000 resolve a grande maioria dos casos, e 5000 atende sites bem complexos. Evite valores exagerados: um limite muito alto pode permitir que requisições maliciosas consumam memória do servidor. Aumente na medida da necessidade real do seu site.

WordPress que salva tudo, sem dor de cabeça

A hospedagem WordPress da Homehost já vem com limites de PHP ajustados para temas e page builders modernos — e você altera o max_input_vars e outras diretivas pelo cPanel em segundos, com suporte em português.

Conhecer a hospedagem WordPress

Conclusão

Quando dados somem de um formulário ou menu sem nenhum erro, o max_input_vars é quase sempre o culpado: o PHP está descartando em silêncio tudo que passa do limite de 1000 variáveis. A solução é direta — aumentar o valor para 3000 (ou 5000 em sites complexos) no php.ini, no .htaccess ou pelo painel, lembrando que essa diretiva não funciona via ini_set() no código. O max_input_time, seu parente, entra quando o problema é o tempo de leitura de dados grandes. Com os dois ajustados na medida certa, os formulários voltam a salvar tudo — e você para de perder configurações sem entender por quê.

Este artigo foi útil?

Obrigado pela resposta!
Picture of Gustavo Gallas

Gustavo Gallas

Analista de sistemas, formado pela PUC-Rio. Programador, gestor de redes e diretor da empresa Homehost. Pai do Bóris, seu pet de estimação. Gosta de rock'n'roll, cerveja artesanal e de escrever sobre assuntos técnicos.

Contato: gustavo.blog@homehost.com.br

Ganhe 30% OFF

Indique seu nome e e-mail,e ganhe um cupom de desconto de 30% para sempre na Homehost!