1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-07-31 22:10:45 +02:00

Merge pull request #4698 from javiexin/ticket/15087

[ticket/15087] Optimize creation of metadata objects by caching
This commit is contained in:
Marc Alexander
2017-04-16 11:15:45 +02:00
5 changed files with 177 additions and 221 deletions

View File

@@ -134,7 +134,7 @@ class check extends \phpbb\console\command\command
try
{
$ext_manager = $this->phpbb_container->get('ext.manager');
$md_manager = $ext_manager->create_extension_metadata_manager($ext_name, null);
$md_manager = $ext_manager->create_extension_metadata_manager($ext_name);
$updates_available = $ext_manager->version_check($md_manager, $recheck, false, $stability);
$metadata = $md_manager->get_metadata('all');

View File

@@ -152,7 +152,12 @@ class manager
*/
public function create_extension_metadata_manager($name)
{
return new \phpbb\extension\metadata_manager($name, $this->config, $this, $this->phpbb_root_path);
if (!isset($this->extensions[$name]['metadata']))
{
$metadata = new \phpbb\extension\metadata_manager($name, $this->get_extension_path($name, true));
$this->extensions[$name]['metadata'] = $metadata;
}
return $this->extensions[$name]['metadata'];
}
/**
@@ -168,7 +173,7 @@ class manager
public function enable_step($name)
{
// ignore extensions that are already enabled
if (isset($this->extensions[$name]) && $this->extensions[$name]['ext_active'])
if ($this->is_enabled($name))
{
return false;
}
@@ -258,7 +263,7 @@ class manager
public function disable_step($name)
{
// ignore extensions that are already disabled
if (!isset($this->extensions[$name]) || !$this->extensions[$name]['ext_active'])
if ($this->is_disabled($name))
{
return false;
}
@@ -336,8 +341,8 @@ class manager
*/
public function purge_step($name)
{
// ignore extensions that do not exist
if (!isset($this->extensions[$name]))
// ignore extensions that are not configured
if (!$this->is_configured($name))
{
return false;
}
@@ -431,25 +436,11 @@ class manager
if ($file_info->isFile() && $file_info->getFilename() == 'composer.json')
{
$ext_name = $iterator->getInnerIterator()->getSubPath();
$composer_file = $iterator->getPath() . '/composer.json';
// Ignore the extension if there is no composer.json.
if (!is_readable($composer_file) || !($ext_info = file_get_contents($composer_file)))
{
continue;
}
$ext_info = json_decode($ext_info, true);
$ext_name = str_replace(DIRECTORY_SEPARATOR, '/', $ext_name);
// Ignore the extension if directory depth is not correct or if the directory structure
// does not match the name value specified in composer.json.
if (substr_count($ext_name, '/') !== 1 || !isset($ext_info['name']) || $ext_name != $ext_info['name'])
if ($this->is_available($ext_name))
{
continue;
$available[$ext_name] = $this->get_extension_path($ext_name, true);
}
$available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/';
}
}
ksort($available);
@@ -472,8 +463,12 @@ class manager
$configured = array();
foreach ($this->extensions as $name => $data)
{
$data['ext_path'] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
$configured[$name] = $data;
if ($this->is_configured($name))
{
unset($data['metadata']);
$data['ext_path'] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
$configured[$name] = $data;
}
}
return $configured;
}
@@ -490,7 +485,7 @@ class manager
$enabled = array();
foreach ($this->extensions as $name => $data)
{
if ($data['ext_active'])
if ($this->is_enabled($name))
{
$enabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
}
@@ -511,7 +506,7 @@ class manager
$disabled = array();
foreach ($this->extensions as $name => $data)
{
if (!$data['ext_active'])
if ($this->is_disabled($name))
{
$disabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
}
@@ -527,7 +522,15 @@ class manager
*/
public function is_available($name)
{
return file_exists($this->get_extension_path($name, true));
$md_manager = $this->create_extension_metadata_manager($name);
try
{
return $md_manager->get_metadata('all') && $md_manager->validate_enable();
}
catch (\phpbb\extension\exception $e)
{
return false;
}
}
/**
@@ -538,7 +541,7 @@ class manager
*/
public function is_enabled($name)
{
return isset($this->extensions[$name]) && $this->extensions[$name]['ext_active'];
return isset($this->extensions[$name]['ext_active']) && $this->extensions[$name]['ext_active'];
}
/**
@@ -549,7 +552,7 @@ class manager
*/
public function is_disabled($name)
{
return isset($this->extensions[$name]) && !$this->extensions[$name]['ext_active'];
return isset($this->extensions[$name]['ext_active']) && !$this->extensions[$name]['ext_active'];
}
/**
@@ -563,7 +566,7 @@ class manager
*/
public function is_configured($name)
{
return isset($this->extensions[$name]);
return isset($this->extensions[$name]['ext_active']);
}
/**

View File

@@ -18,24 +18,6 @@ namespace phpbb\extension;
*/
class metadata_manager
{
/**
* phpBB Config instance
* @var \phpbb\config\config
*/
protected $config;
/**
* phpBB Extension Manager
* @var \phpbb\extension\manager
*/
protected $extension_manager;
/**
* phpBB root path
* @var string
*/
protected $phpbb_root_path;
/**
* Name (including vendor) of the extension
* @var string
@@ -58,19 +40,13 @@ class metadata_manager
* Creates the metadata manager
*
* @param string $ext_name Name (including vendor) of the extension
* @param \phpbb\config\config $config phpBB Config instance
* @param \phpbb\extension\manager $extension_manager An instance of the phpBB extension manager
* @param string $phpbb_root_path Path to the phpbb includes directory.
* @param string $ext_path Path to the extension directory including root path
*/
public function __construct($ext_name, \phpbb\config\config $config, \phpbb\extension\manager $extension_manager, $phpbb_root_path)
public function __construct($ext_name, $ext_path)
{
$this->config = $config;
$this->extension_manager = $extension_manager;
$this->phpbb_root_path = $phpbb_root_path;
$this->ext_name = $ext_name;
$this->metadata = array();
$this->metadata_file = '';
$this->metadata_file = $ext_path . 'composer.json';
}
/**
@@ -81,13 +57,11 @@ class metadata_manager
*/
public function get_metadata($element = 'all')
{
$this->set_metadata_file();
// Fetch the metadata
$this->fetch_metadata();
// Clean the metadata
$this->clean_metadata_array();
// Fetch and clean the metadata if not done yet
if ($this->metadata === array())
{
$this->fetch_metadata_from_file();
}
switch ($element)
{
@@ -110,52 +84,29 @@ class metadata_manager
}
/**
* Sets the filepath of the metadata file
* Gets the metadata file contents and cleans loaded file
*
* @throws \phpbb\extension\exception
*/
private function set_metadata_file()
{
$ext_filepath = $this->extension_manager->get_extension_path($this->ext_name);
$metadata_filepath = $this->phpbb_root_path . $ext_filepath . 'composer.json';
$this->metadata_file = $metadata_filepath;
if (!file_exists($this->metadata_file))
{
throw new \phpbb\extension\exception('FILE_NOT_FOUND', array($this->metadata_file));
}
}
/**
* Gets the contents of the composer.json file
*
* @return bool True if success, throws an exception on failure
* @throws \phpbb\extension\exception
*/
private function fetch_metadata()
private function fetch_metadata_from_file()
{
if (!file_exists($this->metadata_file))
{
throw new \phpbb\extension\exception('FILE_NOT_FOUND', array($this->metadata_file));
}
else
if (!($file_contents = file_get_contents($this->metadata_file)))
{
if (!($file_contents = file_get_contents($this->metadata_file)))
{
throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file));
}
if (($metadata = json_decode($file_contents, true)) === null)
{
throw new \phpbb\extension\exception('FILE_JSON_DECODE_ERR', array($this->metadata_file));
}
array_walk_recursive($metadata, array($this, 'sanitize_json'));
$this->metadata = $metadata;
return true;
throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file));
}
if (($metadata = json_decode($file_contents, true)) === null)
{
throw new \phpbb\extension\exception('FILE_JSON_DECODE_ERR', array($this->metadata_file));
}
array_walk_recursive($metadata, array($this, 'sanitize_json'));
$this->metadata = $metadata;
}
/**
@@ -169,16 +120,6 @@ class metadata_manager
$value = htmlspecialchars($value);
}
/**
* This array handles the cleaning of the array
*
* @return array Contains the cleaned metadata array
*/
private function clean_metadata_array()
{
return $this->metadata;
}
/**
* Validate fields
*
@@ -201,8 +142,23 @@ class metadata_manager
switch ($name)
{
case 'all':
$this->validate_enable();
// no break
$this->validate('display');
if (!$this->validate_dir())
{
throw new \phpbb\extension\exception('EXTENSION_DIR_INVALID');
}
if (!$this->validate_require_phpbb())
{
throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('soft-require'));
}
if (!$this->validate_require_php())
{
throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('require php'));
}
break;
case 'display':
foreach ($fields as $field => $data)
@@ -316,40 +272,4 @@ class metadata_manager
return true;
}
/**
* Outputs the metadata into the template
*
* @param \phpbb\template\template $template phpBB Template instance
*/
public function output_template_data(\phpbb\template\template $template)
{
$template->assign_vars(array(
'META_NAME' => $this->metadata['name'],
'META_TYPE' => $this->metadata['type'],
'META_DESCRIPTION' => (isset($this->metadata['description'])) ? $this->metadata['description'] : '',
'META_HOMEPAGE' => (isset($this->metadata['homepage'])) ? $this->metadata['homepage'] : '',
'META_VERSION' => (isset($this->metadata['version'])) ? $this->metadata['version'] : '',
'META_TIME' => (isset($this->metadata['time'])) ? $this->metadata['time'] : '',
'META_LICENSE' => $this->metadata['license'],
'META_REQUIRE_PHP' => (isset($this->metadata['require']['php'])) ? $this->metadata['require']['php'] : '',
'META_REQUIRE_PHP_FAIL' => (isset($this->metadata['require']['php'])) ? false : true,
'META_REQUIRE_PHPBB' => (isset($this->metadata['extra']['soft-require']['phpbb/phpbb'])) ? $this->metadata['extra']['soft-require']['phpbb/phpbb'] : '',
'META_REQUIRE_PHPBB_FAIL' => (isset($this->metadata['extra']['soft-require']['phpbb/phpbb'])) ? false : true,
'META_DISPLAY_NAME' => (isset($this->metadata['extra']['display-name'])) ? $this->metadata['extra']['display-name'] : '',
));
foreach ($this->metadata['authors'] as $author)
{
$template->assign_block_vars('meta_authors', array(
'AUTHOR_NAME' => $author['name'],
'AUTHOR_EMAIL' => (isset($author['email'])) ? $author['email'] : '',
'AUTHOR_HOMEPAGE' => (isset($author['homepage'])) ? $author['homepage'] : '',
'AUTHOR_ROLE' => (isset($author['role'])) ? $author['role'] : '',
));
}
}
}