diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 648702d0e25..8f480bfac59 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -5848,8 +5848,6 @@ interface string_manager { /** * Standard string_manager implementation * - * TODO: implement lang precompilation - * * @package moodlecore * @copyright 2010 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -5859,19 +5857,28 @@ class core_string_manager implements string_manager { protected $otherroot; /** @var string location of all lang pack local modifications */ protected $localroot; - + /** @var string location of on-disk cache of merged strings */ + protected $cacheroot; /** @var array lang string cache - it will be optimised more later */ protected $cache = array(); - + /** @var int get_string() counter */ + protected $countgetstring = 0; + /** @var int in-memory cache hits counter */ + protected $countmemcache = 0; + /** @var int on-disk cache hits counter */ + protected $countdiskcache = 0; /** - * Crate new instance of amos string manager + * Crate new instance of string manager * * @param string $otherroot location of downlaoded lang packs - usually $CFG->dataroot/lang * @param string $localroot usually the same as $otherroot */ public function __construct($otherroot, $localroot) { + global $CFG; + $this->otherroot = $otherroot; $this->localroot = $localroot; + $this->cacheroot = "$CFG->dataroot/cache/lang"; } /** @@ -5908,15 +5915,26 @@ class core_string_manager implements string_manager { global $CFG; list($plugintype, $pluginname) = normalize_component($component); - - if (!isset($this->cache[$lang])) { - $this->cache[$lang] = array(); + if ($plugintype == 'core' and is_null($pluginname)) { + $component = 'core'; + } else { + $component = $plugintype . '_' . $pluginname; } - if (isset($this->cache[$lang][$plugintype.$pluginname])) { - return $this->cache[$lang][$plugintype.$pluginname]; + // try in-memory cache first + if (isset($this->cache[$lang][$component])) { + $this->countmemcache++; + return $this->cache[$lang][$component]; } + // try on-disk cache then + if (file_exists($this->cacheroot . "/$lang/$component")) { + $this->countdiskcache++; + eval('$this->cache[$lang][$component] = ' . file_get_contents($this->cacheroot . "/$lang/$component") . ';'); + return $this->cache[$lang][$component]; + } + + // no cache found - let us merge all possible sources of the strings if ($plugintype === 'core') { $file = $pluginname; if ($file === null) { @@ -5988,8 +6006,11 @@ class core_string_manager implements string_manager { // we do not want any extra strings from other languages - everything must be in en lang pack $string = array_intersect_key($string, $originalkeys); - $this->cache[$lang][$plugintype.$pluginname] = $string; - + // now we have a list of strings from all possible sources. put it into both in-memory and on-disk + // caches so we do not need to do all this merging and dependecies resolving again + $this->cache[$lang][$component] = $string; + check_dir_exists($this->cacheroot . '/' . $lang, true, true); + file_put_contents($this->cacheroot . "/$lang/$component", var_export($string, true)); return $string; } @@ -6026,6 +6047,7 @@ class core_string_manager implements string_manager { * @return string The String ! */ public function get_string($identifier, $component = '', $a = NULL, $lang = NULL) { + $this->countgetstring++; // there are very many uses of these time formating strings without the 'langconfig' component, // it would not be reasonable to expect that all of them would be converted during 2.0 migration static $langconfigstrs = array( @@ -6101,6 +6123,22 @@ class core_string_manager implements string_manager { return $string; } + /** + * Returns information about the string_manager performance + * @return array + */ + public function get_performance_summary() { + return array(array( + 'langcountgetstring' => $this->countgetstring, + 'langcountmemcache' => $this->countmemcache, + 'langcountdiskcache' => $this->countdiskcache, + ), array( + 'langcountgetstring' => 'get_string calls', + 'langcountmemcache' => 'strings mem cache hits', + 'langcountdiskcache' => 'strings disk cache hits', + )); + } + /** * Returns a localised list of all country names, sorted by localised name. * @@ -9055,6 +9093,16 @@ function get_performance_info() { } } + $stringmanager = get_string_manager(); + if (method_exists($stringmanager, 'get_performance_summary')) { + list($filterinfo, $nicenames) = $stringmanager->get_performance_summary(); + $info = array_merge($filterinfo, $info); + foreach ($filterinfo as $key => $value) { + $info['html'] .= "$nicenames[$key]: $value "; + $info['txt'] .= "$key: $value "; + } + } + if (!empty($PERF->logwrites)) { $info['logwrites'] = $PERF->logwrites; $info['html'] .= 'Log DB writes '.$info['logwrites'].' '; @@ -9667,4 +9715,4 @@ function get_home_page() { } } return HOMEPAGE_SITE; -} \ No newline at end of file +}