Continuation of [r4423] Optimizing the scan of icons on disk. Added a LOCK_EX flag to prevent concurrent access related issues. Safe handing of collision on the cache key (used as a filename).

SVN:trunk[4471]
This commit is contained in:
Romain Quetiez
2016-10-28 14:03:17 +00:00
parent d3f5d05063
commit 95d7bc5319

View File

@@ -1368,23 +1368,30 @@ class RunTimeIconSelectionField extends DesignerIconSelectionField
static protected function FindIconsOnDisk($sBaseDir, $sDir = '')
{
$sKey = md5($sBaseDir.'/'.$sDir);
$sCacheFile = utils::GetCachePath().'available-icons-'.$sKey.'.php';
$aFiles = null;
$sKey = $sBaseDir.'/'.$sDir;
$sShortKey = crc32($sKey);
$sCacheFile = utils::GetCachePath().'available-icons-'.$sShortKey.'.php';
$sCacheClass = 'AvailableIcons_'.$sShortKey;
if (file_exists($sCacheFile))
{
require_once($sCacheFile);
$aFiles = AvailableIcons::$aIconFiles;
if ($sCacheClass::$sKey === $sKey) // crc32 collision detection
{
$aFiles = $sCacheClass::$aIconFiles;
}
}
else
if ($aFiles === null)
{
$aFiles = self::_FindIconsOnDisk($sBaseDir, $sDir);
$sAvailableIcons = '<?php'.PHP_EOL;
$sAvailableIcons .= '// Generated and used by '.__METHOD__.PHP_EOL;
$sAvailableIcons .= 'class AvailableIcons'.PHP_EOL;
$sAvailableIcons .= 'class '.$sCacheClass.PHP_EOL;
$sAvailableIcons .= '{'.PHP_EOL;
$sAvailableIcons .= ' static $sKey = '.var_export($sKey, true).';'.PHP_EOL;
$sAvailableIcons .= ' static $aIconFiles = '.var_export($aFiles, true).';'.PHP_EOL;
$sAvailableIcons .= '}'.PHP_EOL;
file_put_contents($sCacheFile, $sAvailableIcons);
file_put_contents($sCacheFile, $sAvailableIcons, LOCK_EX);
}
return $aFiles;
}