Joomla! installer ja time out
27.01.2008 | Gunnar
Mõnikord tekib olukordi, kus Joomla! CMS'le lisavidinaid installides tekib time out. Põhjuseks võivad olla nii installeerimisel tehtavad mahukamad toimingud kui ka näiteks üles laadimisel suuremate vidinatega tekkiv ajakulu. Pakun välja ühe kiire lahenduse.
Ehkki antud lahendus ei toimi safe mode korral, on sest muudel juhtudel siiski päris palju abi, kui probleeme peaks tekkima. Lahendus ise on lihtne - et install edukalt lõpuni jookseks, kaotame ajutiselt ära ajalised piirangud skriptide jooksutamiseks. Kui install on lõppenud, siis taastame esialgselt seatud piirangu.
Muutus tuleb teha järgmises failis:
/administrator/components/com_installer/installer.class.php
Kui liikuda reale 345, peaks silma hakkama selline funktsioon nagu copyFiles(). Selle funktsiooni kirjutame ümber selliselt.
if (is_array( $p_files ) && count( $p_files )> 0) {
$oldLimit = ini_get('max_execution_time'); // store time limit
set_time_limit(0); // turn time limit off
foreach($p_files as $_file) {
$filesource = mosPathName(mosPathName($p_sourcedir).$_file,false);
$filedest = mosPathName(mosPathName($p_destdir).$_file,false);
if (!file_exists( $filesource )) {
$this->setError( 1, "File $filesource does not exist!" );
set_time_limit($oldLimit); // restore time limit
return false;
} else if (file_exists( $filedest ) && !$overwrite) {
$this->setError( 1, "There is already a file called $filedest - Are you trying to install the same CMT twice?" );
set_time_limit($oldLimit); // restore time limit
return false;
} else {
$path_info = pathinfo($_file);
if (!is_dir( $path_info['dirname'] )){
mosMakePath( $p_destdir, $path_info['dirname'] );
}
if( !( copy($filesource,$filedest) && mosChmod($filedest) ) ) {
$this->setError( 1, "Failed to copy file: $filesource to $filedest" );
set_time_limit($oldLimit); // restore time limit
return false;
}
}
}
set_time_limit($oldLimit); // restore time limit
} else {
return false;
}
return count( $p_files );
}
Nüüd ei ole installeerimise komponent enam kinni kitsastes ajalistes piirangutes ning jõuab oma töö kindlasti ära teha. Kui selgub, et installeerimise järel on veel mahukaid toiminguid, siis antud päringu piires pole mõtet maksimaalset skripti käivitamise aega taastada ning me võime funktsiooni kirjutada selliselt, et ajalisi limiite funktsioonist väljumisel ei taastata.
Kui keegi leiab, et see lahendus on kuidagi ohtlik, siis palun lahkesti kommentaarides teada anda.
