Explorar el Código

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).

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@4471 a333f486-631f-4898-b8df-5754b55c2be0
romainq hace 8 años
padre
commit
de2811b74f
Se han modificado 1 ficheros con 13 adiciones y 6 borrados
  1. 13 6
      application/forms.class.inc.php

+ 13 - 6
application/forms.class.inc.php

@@ -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;
 	}