PrestaShop - Come reindicizzare il database prodotti in modo efficace
Prestashop è uno dei principali CMS specializzati per e-commerce (commercio elettronico). Tra i suoi punti di forza la semplicità, dovuta ad un'interfaccia utente intuitiva e leggera; la possibilità di personalizzazione del negozio elettronico mediante un'ampia disponibilità di estensioni, plugin e temi; le funzionalità avanzate come la gestione integrata del mail-marketing, differenti modalità di spedizione, rispondenza delle modalità di pagamento alla normativa europea con gestione delle tasse in funzione della nazione, gestione dei coupon, statistiche di vendita e tanto altro ancora.
Tuttavia un punto sensibile esposto da Prestashop è la necessità di re-indicizzare periodicamente i prodotti, al fine di generare sul database la tabella aggiornata per una ricerca veloce sul sito. L'operazione di reindicizzazione sin dalle prime versioni di Prestashop, come pure nelle ultime, è particolarmente heavy (gravosa), tanto che solitamente il processo PHP sul server va in timeout, con il risultato di produrre un database incompleto impedendo de facto una ricerca efficiente dei prodotti agli utenti/clienti. Questa circostanza non favorisce di certo gli acquisti che sono l'obiettivo finale dei nostri clienti hosting Prestashop.
La procedura standard dal back-end di Prestashop prevede due opzioni per la reindicizzazione dei prodotti: una con invocazione manuale - cliccando sul link per la reindicizzazione - e l'altra schedulata tramite CRON. Entrambe sono evidenziate con un punto rosso nella figura seguente.
Il problema principale è che in entrambi i casi il processo di reindicizzazione passa per il complesso "Apache (o altro webserver) - PHP", con esito sub conditio dei relativi timeout e conseguente stress del daemon webserver che dovrà dedicare processi child - e risorse - a questo compito.
Nel caso in cui il numero dei prodotti sia nell'ordine delle migliaia o decine di migliaia, il rischio di timeout diventa pressocché una certezza e non più una probabilità.
Per ovviare a questo problema, una strada è bypassare il webserver (Apache) e lanciare la reindicizzazione dei prodotti da terminale come shell script.
Il candidato migliore per questo compito è proprio lo script searchcron.php del core Prestashop richiamato via CRON.
script searchcron.php
<?php if (!defined('_PS_ADMIN_DIR_')) { define('_PS_ADMIN_DIR_', getcwd()); } include(_PS_ADMIN_DIR_.'/../config/config.inc.php'); if (!Tools::getValue('id_shop')) { Context::getContext()->shop->setContext(Shop::CONTEXT_ALL); } else { Context::getContext()->shop->setContext(Shop::CONTEXT_SHOP, (int)Tools::getValue('id_shop')); } if (substr(_COOKIE_KEY_, 34, 8) != Tools::getValue('token')) { die; } ini_set('max_execution_time', 7200); Search::indexation(Tools::getValue('full')); if (Tools::getValue('redirect') && isset($_SERVER['HTTP_REFERER'])) { Tools::redirectAdmin($_SERVER['HTTP_REFERER'].'&conf=4'); }
Lo script verifica la consistenza del token di sicurezza per l'esecuzione, incrementa il tempo di esecuzione dello script ad un massimo di 2 ore - configurazione non sempre possibile per le limitazioni imposte dai provider ed è comunque regola di buon senso non incrementare così tanto il tempo massimo di esecuzione di uno script - ed effettua l'indicizzazione invocando la funzione Search::indexation cui viene passato il valore Tools::getvalue('full').
Affinché l'indicizzazione avvenga a valle della verifica token, è necessario che Tools::getvalue('full') restituisca il valore 1.
Ciò premesso, lo script di shell dedotto da searchcron.php da lanciare da terminale sarà il seguente prestashopNetlogicaIndexer.php.
script prestashopNetlogicaIndexer.php
<?php // Netlogica hack - Prestashop search indexing echo "\n".'Starting Netlogica Indexing Hack...'."\n"; $timeStart = microtime(true); include({path_fisico_hosting}.'/config/config.inc.php'); Search::indexation(1); $timeEnd = microtime(true); $executionTime = ($timeEnd - $timeStart); echo '-> index complete '.$executionTime.' sec.'."\n\n"; ?>
Lo script potrà essere richiamato, analogamente allo script searchcron.php, anch'esso via CRON, impostando lo scheduler ad esempio da Plesk oppure direttamente tramite CRONTAB qualora si abbia un accesso SSH. Il vantaggio della soluzione shell script è che viene completamente bypassato il daemon Apache.
Nella figura seguente è riportato l'output di esecuzione dello script da terminale.
Come si vede, l'esecuzione su circa 4000 articoli ha impiegato meno di 60 secondi ed il processo del webserver Apache è stato completamente bypassato.
Il risultato è quello di avere il webserver libero da un pesante carico di lavoro a vantaggio della navigazione degli utenti, con la garanzia che il database interrogato dal modulo di ricerca sarà sempre aggiornato favorendo gli acquisti della clientela.
Come suindicato, lo script prestashopNetlogicaIndexer.php potrà essere richiamato via CRON avendo precedentemente pianificato l'esecuzione da CRONTAB. Per un esempio di configurazione di CRONTAB via terminale, vedi l'articolo del blog Netlogica: Riavvio dei servizi? Automatico è meglio!