PrestaShop max_input_vars: Perché i Prodotti con Molte Combinazioni Non Si Salvano
Comprendere max_input_vars in PrestaShop
Se hai mai provato a salvare un prodotto con decine o centinaia di combinazioni in PrestaShop e hai riscontrato un salvataggio silenzioso fallito, un salvataggio parziale o un errore criptico, il colpevole è quasi certamente la direttiva PHP max_input_vars. Questa impostazione controlla quanti campi di form individuali PHP accetterà in una singola richiesta POST. Quando PrestaShop invia un form prodotto che supera questo limite, ogni campo oltre la soglia viene silenziosamente scartato, portando a salvataggi incompleti, combinazioni mancanti o dati che semplicemente scompaiono senza alcun messaggio di errore visibile.
Per impostazione predefinita, la maggior parte delle installazioni PHP viene fornita con max_input_vars impostato a 1000. Per un semplice blog o sito vetrina, questo è più che sufficiente. Per PrestaShop, tuttavia, le pagine di modifica dei prodotti possono generare migliaia di campi di form, specialmente quando sono coinvolte combinazioni, campi multilingua e caratteristiche personalizzate. Comprendere questa direttiva, sapere come calcolare il valore di cui il tuo negozio ha effettivamente bisogno e applicare la correzione correttamente ti farà risparmiare ore di debugging.
Perché PrestaShop Necessita di Valori max_input_vars Elevati
Il form di modifica prodotto di PrestaShop è uno dei form più complessi in qualsiasi piattaforma e-commerce. Ogni combinazione di un prodotto genera molteplici campi di input: uno per l'impatto sul prezzo, uno per l'impatto sul peso, uno per la quantità, uno per il riferimento, uno per l'EAN-13, uno per l'UPC, uno per l'MPN, uno per la quantità minima, uno per la soglia di stock basso, uno per la data di disponibilità e diversi altri a seconda della configurazione. Una singola combinazione può facilmente produrre da 15 a 25 campi di form.
Ora moltiplica questo per il numero di combinazioni. Una maglietta disponibile in 5 taglie e 10 colori ha 50 combinazioni. A 20 campi per combinazione, sono già 1.000 campi solo per la scheda combinazioni. Aggiungi i campi del prodotto base, i campi SEO per ogni lingua, i valori delle caratteristiche, i prezzi specifici e le altre schede, e puoi facilmente raggiungere 1.500-2.000 campi per un prodotto moderatamente complesso.
Per i negozi che vendono prodotti con set di attributi estesi, come elettronica con diverse capacità di archiviazione, colori, opzioni di RAM e varianti regionali, un singolo prodotto può avere 200 o più combinazioni, generando 4.000+ campi di form. Il limite predefinito di 1.000 non è nemmeno lontanamente sufficiente.
Sintomi di max_input_vars Troppo Basso
L'aspetto più frustrante del raggiungimento del limite max_input_vars è che PHP non genera un errore. Tronca silenziosamente i dati di input. Questo significa che vedrai una varietà di sintomi confusi senza alcuna indicazione chiara di cosa sia andato storto.
Il sintomo più comune è che le combinazioni scompaiono dopo il salvataggio. Crei 80 combinazioni, clicchi salva e quando la pagina si ricarica ne sono presenti solo 40. Il form ha inviato tutte le 80, ma PHP ha elaborato solo la prima porzione dei dati POST prima di raggiungere il limite, quindi le combinazioni rimanenti non sono mai state ricevute dal server.
Un altro sintomo comune è che i dati del prodotto si salvano parzialmente. La scheda informazioni di base si salva correttamente, ma i dati di prezzo, SEO o combinazioni vengono persi. Questo succede perché i campi del form vengono inviati in un ordine specifico, e qualsiasi campo che viene dopo il punto di taglio viene scartato.
Potresti anche sperimentare la pagina del prodotto che si ricarica semplicemente senza salvare, o PrestaShop che mostra un errore generico come "Si è verificato un errore durante l'aggiornamento del prodotto". In PrestaShop 1.7 e 8.x, la pagina prodotto basata su Symfony potrebbe mostrare errori di validazione per campi obbligatori che erano effettivamente compilati ma troncati da PHP.
Un sintomo meno ovvio riguarda i negozi multilingua. Se il tuo negozio supporta 5 lingue, ogni campo di testo viene moltiplicato per 5. Un prodotto che si salva correttamente in un negozio monolingua fallisce in uno multilingua perché i campi aggiuntivi delle lingue spingono il totale oltre il limite.
Come Verificare il Valore Attuale di max_input_vars
Prima di apportare modifiche, verifica la tua impostazione attuale. Crea un file PHP nella directory principale di PrestaShop (ricorda di eliminarlo dopo per sicurezza):
<?php phpinfo(); ?>
Accedi a questo file tramite il browser e cerca max_input_vars. Vedrai sia il Valore Locale (quello attualmente attivo) sia il Valore Master (il predefinito da php.ini). Presta attenzione al Valore Locale, poiché potrebbe differire dal Valore Master se un .htaccess o una configurazione per directory lo sovrascrive.
In alternativa, puoi verificare dal back office di PrestaShop. Naviga in Parametri Avanzati, poi Informazioni. La sezione configurazione PHP mostra le impostazioni PHP chiave incluso max_input_vars. PrestaShop 1.7.7 e versioni successive mostrano anche un avviso in questa pagina se il valore è considerato troppo basso.
Calcolare il Valore max_input_vars di Cui Hai Bisogno
Piuttosto che impostare ciecamente un numero alto, puoi stimare il valore che il tuo negozio richiede. Usa questa formula come base di partenza:
Valore richiesto = (numero di combinazioni x campi per combinazione) + campi prodotto base + (campi di testo x numero di lingue) + margine di sicurezza
Per un esempio pratico, considera un negozio con 3 lingue e un prodotto con 100 combinazioni. Il calcolo sarebbe: 100 combinazioni moltiplicate per 20 campi ciascuna equivalgono a 2.000. I campi prodotto base su tutte le schede contribuiscono con circa 200. I campi di testo (nome, descrizione, meta title, meta description, link rewrite e altri) moltiplicati per 3 lingue aggiungono altri 150. Aggiungendo un margine di sicurezza del 20% si arriva a un totale di circa 2.820.
Per la maggior parte dei negozi PrestaShop, impostare max_input_vars a 10000 fornisce ampio margine. I negozi con prodotti che hanno 300+ combinazioni o che operano in 5+ lingue dovrebbero considerare 20000 o anche 50000. L'overhead di memoria di un valore più alto è trascurabile sui server moderni.
Come Aumentare max_input_vars
Metodo 1: php.ini (Raccomandato)
Se hai accesso alla configurazione PHP del tuo server, modificare php.ini è l'approccio più pulito. Individua il tuo file php.ini (l'output di phpinfo() ti dice esattamente quale file viene caricato) e trova o aggiungi la seguente riga:
max_input_vars = 10000
Dopo aver salvato il file, riavvia il server web o il servizio PHP-FPM affinché la modifica abbia effetto. Su Apache con mod_php, riavvia Apache. Su Nginx con PHP-FPM, riavvia il servizio php-fpm. Il comando esatto dipende dal tuo sistema operativo e dalla versione PHP.
Metodo 2: .htaccess (Apache con mod_php o mod_fcgid)
Se non hai accesso a php.ini, come su hosting condiviso, puoi provare ad aggiungere la direttiva al file .htaccess nella directory principale di PrestaShop:
php_value max_input_vars 10000
Questo metodo funziona solo se PHP viene eseguito come modulo Apache (mod_php). Se il tuo hosting usa PHP-FPM o CGI, questa direttiva causerà un errore 500 Internal Server Error. In tal caso, rimuovi la riga immediatamente e prova il metodo successivo.
Metodo 3: .user.ini (PHP-FPM / CGI)
Per i server che eseguono PHP-FPM, crea o modifica un file .user.ini nella directory principale di PrestaShop:
max_input_vars = 10000
Nota che le modifiche a .user.ini non sono immediate. PHP memorizza nella cache questo file per un periodo definito da user_ini.cache_ttl, che è predefinito a 300 secondi (5 minuti). Attendi almeno 5 minuti dopo aver salvato il file prima di testare.
Metodo 4: Pannello di Controllo dell'Hosting
Molti provider di hosting espongono le impostazioni PHP attraverso il loro pannello di controllo. In cPanel, naviga in "Select PHP Version" o "MultiPHP INI Editor" e cerca max_input_vars. In Plesk, vai nelle Impostazioni PHP per il tuo dominio. DirectAdmin e altri pannelli hanno opzioni simili. Questo è spesso il metodo più semplice su hosting condiviso.
La Complicazione della Patch Suhosin
Suhosin è una patch di sicurezza PHP che era comune sui server più vecchi, in particolare quelli con PHP 5.x. Impone il proprio set di limiti di input che sovrascrivono l'impostazione standard max_input_vars. Anche se aumenti max_input_vars a 10000, Suhosin potrebbe ancora imporre un limite inferiore attraverso le proprie direttive.
Le impostazioni specifiche di Suhosin che devi regolare sono:
suhosin.post.max_vars = 10000suhosin.request.max_vars = 10000
Queste devono essere impostate in aggiunta al max_input_vars standard. Se l'output di phpinfo() mostra una sezione Suhosin, sei interessato e devi regolare tutti e tre i valori. Le impostazioni Suhosin tipicamente possono essere cambiate solo in php.ini, non in .htaccess o .user.ini.
Sulle installazioni PHP 7.x e 8.x moderne, Suhosin è raramente presente. Se stai eseguendo una versione PHP recente, quasi certamente non devi preoccupartene. Tuttavia, se sei su un account di hosting condiviso più vecchio che non è stato aggiornato, vale la pena verificare.
Approcci Alternativi per Prodotti con 500+ Combinazioni
Mentre aumentare max_input_vars risolve il problema immediato, i negozi con numeri estremamente elevati di combinazioni per prodotto dovrebbero considerare approcci alternativi che riducono il conteggio dei campi del form o evitano completamente la limitazione.
Importare le Combinazioni tramite CSV
La funzionalità di importazione integrata di PrestaShop elabora le combinazioni attraverso l'upload di file anziché l'invio del form, bypassando completamente il limite max_input_vars. Prepara un file CSV con i dati delle tue combinazioni e importalo attraverso il back office in Parametri Avanzati, Importa. Questo è spesso l'approccio più pratico per prodotti con centinaia di combinazioni.
Usare l'API Webservice di PrestaShop
L'API webservice di PrestaShop consente di creare e aggiornare le combinazioni in modo programmatico. Le richieste API non sono soggette a max_input_vars perché usano payload strutturati in XML o JSON anziché dati POST codificati come form. Questo approccio richiede conoscenze tecniche ma scala a qualsiasi numero di combinazioni.
Dividere i Prodotti Grandi
In alcuni casi, ha più senso dal punto di vista commerciale dividere un prodotto con 500+ combinazioni in più prodotti. Un prodotto con 5 taglie e 100 colori potrebbe essere diviso in 5 prodotti, uno per taglia, ciascuno con 100 opzioni di colore. Questo non solo evita la limitazione tecnica ma spesso migliora anche l'esperienza del cliente.
Gestire le Combinazioni in Batch
Se devi utilizzare il form del back office, crea le combinazioni in batch più piccoli. Genera 50 combinazioni alla volta, salva, poi genera le successive 50. Questo è noioso ma evita di raggiungere il limite senza richiedere alcuna modifica alla configurazione del server.
Verificare la Correzione
Dopo aver aumentato max_input_vars, verifica che la modifica abbia avuto effetto. Controlla di nuovo phpinfo() e conferma che il Valore Locale corrisponde a quello che hai impostato. Poi testa modificando il tuo prodotto più complesso, apportando una piccola modifica e salvando. Tutte le combinazioni e i dati dovrebbero essere preservati.
Se il problema persiste dopo aver aumentato il valore, verifica queste possibilità aggiuntive. Il tuo provider di hosting potrebbe sovrascrivere le tue impostazioni con una configurazione globale. L'istanza PHP che serve il tuo sito web potrebbe essere diversa da quella mostrata in un phpinfo() da CLI. Potrebbe esserci un limite del server web come LimitRequestBody di Apache o client_max_body_size di Nginx che sta troncando anche la richiesta. Alcuni web application firewall (WAF) o plugin di sicurezza (come ModSecurity) impongono i propri limiti sulla dimensione dei dati POST e sul numero di parametri.
Impostazioni PHP Correlate da Verificare
Mentre regoli max_input_vars, rivedi queste impostazioni correlate che possono causare problemi con form prodotto di grandi dimensioni:
post_max_size: Imposta la dimensione massima dei dati POST in byte. Se i dati del tuo form superano questo limite (tipicamente quando i prodotti hanno molti campi di testo grandi in più lingue), l'intero POST viene scartato. Imposta questo ad almeno 32M per PrestaShop.
memory_limit: L'elaborazione di migliaia di campi di form richiede memoria. Se PHP esaurisce la memoria durante l'analisi dell'input, la richiesta fallisce. Un valore di 256M o 512M è raccomandato per PrestaShop.
max_execution_time: Il salvataggio di un prodotto con molte combinazioni comporta numerose query al database. Se l'operazione di salvataggio richiede più tempo del tempo di esecuzione consentito, verrà terminata a metà processo, portando a salvataggi parziali. Imposta questo ad almeno 300 secondi per negozi con prodotti complessi.
max_input_nesting_level: PrestaShop usa array annidati nei dati del form (ad esempio, i campi multilingua usano array come name[1], name[2]). Il livello di annidamento predefinito di 64 è generalmente sufficiente, ma se incontri problemi con strutture di form profondamente annidate, aumentalo a 128 o 256.
Note Specifiche per Versione di PrestaShop
In PrestaShop 1.6, la pagina prodotto è interamente PHP legacy con un invio di form tradizionale. Il problema max_input_vars riguarda tutte le operazioni sulla pagina prodotto. Non c'è soluzione alternativa se non aumentare il limite o usare le importazioni.
PrestaShop 1.7 ha introdotto una pagina prodotto parzialmente basata su Symfony. Sebbene l'architettura sia cambiata, l'invio del form sottostante usa ancora dati POST ed è ancora soggetto agli stessi limiti PHP. Il componente form di Symfony potrebbe mostrare messaggi di errore più informativi quando mancano dei campi, ma la causa principale è la stessa.
PrestaShop 8.x presenta una pagina prodotto completamente ridisegnata con una nuova struttura form Symfony. La gestione delle combinazioni è stata significativamente rielaborata, con le combinazioni ora gestite attraverso un'interfaccia dedicata che carica e salva i dati tramite AJAX in batch più piccoli. Questa modifica architetturale riduce naturalmente l'impatto di max_input_vars per i dati delle combinazioni, anche se il form principale del prodotto può ancora essere influenzato in negozi multilingua con molte caratteristiche.
PrestaShop 9.x continua la tendenza verso la gestione dei dati basata su AJAX, riducendo ulteriormente la dipendenza da invii di form massivi. Tuttavia, max_input_vars rimane rilevante per le operazioni massive e i moduli legacy che usano ancora invii di form tradizionali.
Prevenire Problemi Futuri
Imposta max_input_vars a un valore generoso durante l'installazione iniziale di PrestaShop piuttosto che aspettare che i problemi si manifestino. Un valore di 20000 è sicuro per praticamente tutti gli scenari e non ha un impatto significativo sulle prestazioni. Documenta l'impostazione nelle tue note di configurazione del server in modo che le future migrazioni la preservino.
Se sei un provider di hosting o un amministratore di sistema che gestisce più installazioni PrestaShop, considera di impostare max_input_vars = 20000 come predefinito nei tuoi template di configurazione PHP. Questa singola modifica elimina una delle richieste di supporto più comuni relative alla gestione dei prodotti PrestaShop.
Monitora i log degli errori dopo aver apportato le modifiche. Sebbene il troncamento max_input_vars in sé non generi errori PHP, alcune versioni di PrestaShop registrano avvisi quando rilevano che i dati ricevuti non corrispondono ai dati attesi. Queste voci di log possono aiutarti a identificare se il limite viene ancora raggiunto nonostante l'aumento.
Questa risposta ti è stata utile?
Hai ancora domande?
Can't find what you're looking for? Send us your question and we'll get back to you quickly.