From 52b6fde352fd0282a8a3ddfc3f2ff218d97f7dbb Mon Sep 17 00:00:00 2001 From: marcus Date: Tue, 3 Mar 2009 11:18:09 +0000 Subject: Closes #831: Plugin view location is now cached in a file in dataroot and is invalidated on upgrade and plugin enable/disable/reorder. This means that views no longer have to be discovered on boot - reducing file IO from crazy amounts to 1. This also helps make adding new plugins a linear event. git-svn-id: https://code.elgg.org/elgg/trunk@3025 36083f99-b078-4883-b0ff-0f9b5a30f544 --- actions/admin/plugins/disable.php | 5 +++- actions/admin/plugins/disableall.php | 5 +++- actions/admin/plugins/enable.php | 7 ++++-- actions/admin/plugins/enableall.php | 7 +++++- actions/admin/plugins/reorder.php | 5 +++- engine/lib/elgglib.php | 15 +++++++++++ engine/lib/plugins.php | 49 +++++++++++++++++++++++++----------- upgrade.php | 5 +++- 8 files changed, 77 insertions(+), 21 deletions(-) diff --git a/actions/admin/plugins/disable.php b/actions/admin/plugins/disable.php index cbe75a665..32ae451a7 100644 --- a/actions/admin/plugins/disable.php +++ b/actions/admin/plugins/disable.php @@ -32,7 +32,10 @@ register_error(sprintf(elgg_echo('admin:plugins:disable:no'), $p)); } - elgg_view_regenerate_simplecache(); + elgg_view_regenerate_simplecache(); + + $cache = elgg_get_filepath_cache(); + $cache->delete('view_paths'); forward($_SERVER['HTTP_REFERER']); exit; diff --git a/actions/admin/plugins/disableall.php b/actions/admin/plugins/disableall.php index efb91f773..a01b74fa5 100644 --- a/actions/admin/plugins/disableall.php +++ b/actions/admin/plugins/disableall.php @@ -29,7 +29,10 @@ register_error(sprintf(elgg_echo('admin:plugins:disable:no'), $p)); } - elgg_view_regenerate_simplecache(); + elgg_view_regenerate_simplecache(); + + $cache = elgg_get_filepath_cache(); + $cache->delete('view_paths'); forward($_SERVER['HTTP_REFERER']); exit; diff --git a/actions/admin/plugins/enable.php b/actions/admin/plugins/enable.php index 072924eec..d81ab0551 100644 --- a/actions/admin/plugins/enable.php +++ b/actions/admin/plugins/enable.php @@ -32,8 +32,11 @@ register_error(sprintf(elgg_echo('admin:plugins:enable:no'), $p)); } - elgg_view_regenerate_simplecache(); - + elgg_view_regenerate_simplecache(); + + $cache = elgg_get_filepath_cache(); + $cache->delete('view_paths'); + forward($_SERVER['HTTP_REFERER']); exit; ?> \ No newline at end of file diff --git a/actions/admin/plugins/enableall.php b/actions/admin/plugins/enableall.php index 5e0d8c3b5..f31b4593d 100644 --- a/actions/admin/plugins/enableall.php +++ b/actions/admin/plugins/enableall.php @@ -11,7 +11,7 @@ */ require_once(dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"); - + // block non-admin users admin_gatekeeper(); @@ -29,7 +29,12 @@ register_error(sprintf(elgg_echo('admin:plugins:enable:no'), $p)); } + // Regen view cache elgg_view_regenerate_simplecache(); + + // Regen paths cache + $cache = elgg_get_filepath_cache(); + $cache->delete('view_paths'); forward($_SERVER['HTTP_REFERER']); exit; diff --git a/actions/admin/plugins/reorder.php b/actions/admin/plugins/reorder.php index be5981394..0e328f54d 100644 --- a/actions/admin/plugins/reorder.php +++ b/actions/admin/plugins/reorder.php @@ -46,7 +46,10 @@ else register_error(sprintf(elgg_echo('admin:plugins:reorder:no'), $plugin)); - elgg_view_regenerate_simplecache(); + elgg_view_regenerate_simplecache(); + + $cache = elgg_get_filepath_cache(); + $cache->delete('view_paths'); forward($_SERVER['HTTP_REFERER']); diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 1b2629a22..5571339cd 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -495,6 +495,21 @@ } } + /** + * This is a factory function which produces an ElggCache object suitable for caching file load paths. + * + * TODO: Can this be done in a cleaner way? + * TODO: Swap to memcache etc? + */ + function elgg_get_filepath_cache() + { + global $CONFIG; + static $FILE_PATH_CACHE; + if (!$FILE_PATH_CACHE) $FILE_PATH_CACHE = new ElggFileCache($CONFIG->dataroot); + + return $FILE_PATH_CACHE; + } + /** * Internal function for retrieving views used by elgg_view_tree * diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php index 937766e66..c70cd8ebc 100644 --- a/engine/lib/plugins.php +++ b/engine/lib/plugins.php @@ -210,10 +210,21 @@ * @package Elgg * @subpackage Core */ - function load_plugins() { - - global $CONFIG; - if (!empty($CONFIG->pluginspath)) { + function load_plugins() { + + global $CONFIG; + + $cache = elgg_get_filepath_cache(); + + if (!empty($CONFIG->pluginspath)) { + + // See if we have cached values for things + $cached_view_paths = $cache->load('view_paths'); + if ($cached_view_paths) $CONFIG->views = unserialize($cached_view_paths); + + $cached_lang_paths = $cache->load('lang_paths'); + if ($cached_lang_paths) $CONFIG->views = unserialize($cached_lang_paths); + // temporary disable all plugins if there is a file called 'disabled' in the plugin dir if (file_exists($CONFIG->pluginspath . "disabled")) @@ -221,28 +232,38 @@ $plugins = get_plugin_list(); - if (sizeof($plugins)) + if (sizeof($plugins)) + { foreach($plugins as $mod) { if (is_plugin_enabled($mod)) { if (file_exists($CONFIG->pluginspath . $mod)) { if (!include($CONFIG->pluginspath . $mod . "/start.php")) - throw new PluginException(sprintf(elgg_echo('PluginException:MisconfiguredPlugin'), $mod)); - if (is_dir($CONFIG->pluginspath . $mod . "/views")) { - if ($handle = opendir($CONFIG->pluginspath . $mod . "/views")) { - while ($viewtype = readdir($handle)) { - if (!in_array($viewtype,array('.','..','.svn','CVS')) && is_dir($CONFIG->pluginspath . $mod . "/views/" . $viewtype)) { - autoregister_views("",$CONFIG->pluginspath . $mod . "/views/" . $viewtype,$CONFIG->pluginspath . $mod . "/views/", $viewtype); + throw new PluginException(sprintf(elgg_echo('PluginException:MisconfiguredPlugin'), $mod)); + + if (!$cached_view_paths) + { + if (is_dir($CONFIG->pluginspath . $mod . "/views")) { + if ($handle = opendir($CONFIG->pluginspath . $mod . "/views")) { + while ($viewtype = readdir($handle)) { + if (!in_array($viewtype,array('.','..','.svn','CVS')) && is_dir($CONFIG->pluginspath . $mod . "/views/" . $viewtype)) { + autoregister_views("",$CONFIG->pluginspath . $mod . "/views/" . $viewtype,$CONFIG->pluginspath . $mod . "/views/", $viewtype); + } } } - } - } + } + } + if (is_dir($CONFIG->pluginspath . $mod . "/languages")) { register_translations($CONFIG->pluginspath . $mod . "/languages/"); } } } } - + } + + // Cache results + if (!$cached_view_paths) + $cache->save('view_paths', serialize($CONFIG->views)); } } diff --git a/upgrade.php b/upgrade.php index 90207f880..631ab1c67 100644 --- a/upgrade.php +++ b/upgrade.php @@ -22,7 +22,10 @@ if (version_upgrade_check()) { version_upgrade(); } - datalist_set('simplecache_lastupdate',0); + datalist_set('simplecache_lastupdate',0); + + $cache = elgg_get_filepath_cache(); + $cache->delete('view_paths'); } else { global $CONFIG; echo elgg_view('settings/upgrading'); -- cgit v1.2.3