Anche in questa occasione ciò che pubblico non è una vera e propria Fix ma un modo “rudimentale” per aggirare il problema e garantire il funzionamento dell’applicativo.
In questo caso parliamo del componente “Virtuemart” di Joomla che consente di trasformare il Cms in un negozio on line. In alcuni Hosting a causa della configurazione del “Timeout CGI” impostato in Apache possono verificarsi errori “500 Internal Server Error” in occasione dell’aggiunta di nuove immagini per un prodotto.
Questo perché quando si carica l’interfaccia di upload il Virtuemart esegue un check su tutti i file e cartelle della cartella predefinita delle immagini. Se, quindi, sono presenti numerosi file lo script non riesce a terminare in tempo la verifica di ogni singolo file andando in errore di “Timeout CGI”.
Nel mio attuale Hosting tale Timeout è impostato a 60 secondi e, quindi, ho provveduto ad editare direttamente il codice sorgente del Virtuemart per fare in modo che non esegua tale verifica indipendentemente da quanti file son presenti nella cartella predefinita.
Per fare ciò è necessario aprire il file “product.file_form.php” presente nella path:
<root_di_Joomla>/administrator/components/com_virtuemart/html/
e successivamente posizionarsi alla Riga 105 che apparirà come segue:
$downloadRootFiles = vmReadDirectory(DOWNLOADROOT, '.', true);
e modificarla variando il parametro da “true” a “false” come di seguito:
$downloadRootFiles = vmReadDirectory(DOWNLOADROOT, '.', false);
In questo modo il problema dell’error “500 Internal Server Error” in fase di upload dei file sarà risolto.
Tengo a precisare che la versione del Virtuemart su cui ho eseguito tali modifiche è la 1.1.3.
Resto a disposizione per qualsiasi chiarimento o qualora dopo tali modifiche si riscontrino altri generi di problematiche.
[11/03/2009 – 00.40] AGGIORNAMENTO #1: Ho fatto delle verifiche per validare il perché di tale modifica e vi riporto direttamente il codice dell’intera funzione “vmReadDirectory” presa dal file originale “ps_main.php“:
/** * Utility function to read the files in a directory * @param string The file system path * @param string A filter for the names * @param boolean Recurse search into sub-directories * @param boolean True if to prepend the full path to the file name */ function vmReadDirectory( $path, $filter='.', $recurse=false, $fullpath=false ) { $arr = array(); if (!@is_dir( $path )) { return $arr; } $handle = opendir( $path ); while ($file = readdir($handle)) { $dir = vmPathName( $path.'/'.$file, false ); $isDir = is_dir( $dir ); if (($file != ".") && ($file != "..")) { if (preg_match( "/$filter/", $file )) { if ($fullpath) { $arr[] = trim( vmPathName( $path.'/'.$file, false ) ); } else { $arr[] = trim( $file ); } } if ($recurse && $isDir) { $arr2 = vmReadDirectory( $dir, $filter, $recurse, $fullpath ); $arr = array_merge( $arr, $arr2 ); } } } closedir($handle); asort($arr); return $arr; }
Come spiegato nei commenti della funzione stessa l’impostare su “false” il 3° parametro disabilita la ricorsione evitando che il check dei file venga effettuato anche nelle sottocartelle generando l’errore di Timeout (Timeout CGI = 60 sec; max_execution_time = 120).