diff options
author | David M <davidmj@users.sourceforge.net> | 2008-06-12 07:24:13 +0000 |
---|---|---|
committer | David M <davidmj@users.sourceforge.net> | 2008-06-12 07:24:13 +0000 |
commit | 0ebc5cc9eee8b4f904d624a8c4506ae6223ea5db (patch) | |
tree | 942095d3f5175441543af2d60479a104bf15601b | |
parent | 0ca7e81ca47e32a5edf3c8fe1b9388be76fe57a9 (diff) | |
download | forums-0ebc5cc9eee8b4f904d624a8c4506ae6223ea5db.tar forums-0ebc5cc9eee8b4f904d624a8c4506ae6223ea5db.tar.gz forums-0ebc5cc9eee8b4f904d624a8c4506ae6223ea5db.tar.bz2 forums-0ebc5cc9eee8b4f904d624a8c4506ae6223ea5db.tar.xz forums-0ebc5cc9eee8b4f904d624a8c4506ae6223ea5db.zip |
The beginnings of the destruction of phpBB's greatest bottleneck, dynamic css...
As of phpBB 3.0.x, we take our "generic" CSS for a theme and later on combine it with the imagesets and languages as needed... What we did for 3.0.x involved dynamically resolving the variables in the CSS and then sending it off, caching it at several layers (except the one that mattered). The biggest issue with style.php is that it is one giant str_replace on every page load, no matter what; cache be damned. Instead, the trick is to cache the full compilation earlier on...
Further work to do: kill all the old crap and fully integrate the new solution
git-svn-id: file:///svn/phpbb/trunk@8649 89ea8834-ac86-4346-8a33-228a782c2dd0
-rw-r--r-- | phpBB/includes/acp/acp_styles.php | 117 | ||||
-rw-r--r-- | phpBB/includes/functions.php | 2 |
2 files changed, 118 insertions, 1 deletions
diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index e5002a3de6..80bc1eb935 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -1060,6 +1060,9 @@ parse_css_file = {PARSE_CSS_FILE} } $db->sql_freeresult($result); + $theme_info['theme_id'] = $theme_id; + self::generate_stylesheets($theme_info); + // save changes to the theme if the user submitted any if ($save_changes) { @@ -2856,6 +2859,120 @@ parse_css_file = {PARSE_CSS_FILE} } + function generate_stylesheets($theme) + { + global $db, $phpbb_root_path, $config; + + // get all the lang_dirs + $sql = 'SELECT lang_dir + FROM ' . LANG_TABLE; + $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) + { + $lang_dirs[] = $row['lang_dir']; + } + $db->sql_freeresult($result); + + // get all imagesets this theme is associated with + $sql = 'SELECT si.imageset_id, si.imageset_path, st.template_path + FROM ' . STYLES_TABLE . ' s, ' . STYLES_IMAGESET_TABLE . ' si, ' . STYLES_TEMPLATE_TABLE . ' st + WHERE s.theme_id = ' . (int) $theme['theme_id'] . ' + AND s.imageset_id = si.imageset_id + AND s.template_id = st.template_id'; + $result = $db->sql_query($sql); + while ($theme_row = $db->sql_fetchrow($result)) + { + foreach ($lang_dirs as $lang_dir) + { + $theme['imageset_path'] = $theme_row['imageset_path']; + $theme['imageset_id'] = $theme_row['imageset_id']; + $theme['template_path'] = $theme_row['template_path']; + + $user_image_lang = (file_exists($phpbb_root_path . 'styles/' . $theme['imageset_path'] . '/imageset/' . $lang_dir)) ? $lang_dir : $config['default_lang']; + + // Parse Theme Data + $replace = array( + '{T_THEME_PATH}' => "./styles/" . $theme['theme_path'] . '/theme', + '{T_TEMPLATE_PATH}' => "./styles/" . $theme['template_path'] . '/template', + '{T_IMAGESET_PATH}' => "./styles/" . $theme['imageset_path'] . '/imageset', + '{T_IMAGESET_LANG_PATH}' => "./styles/" . $theme['imageset_path'] . '/imageset/' . $user_image_lang, + '{T_STYLESHEET_NAME}' => $theme['theme_name'], + '{S_USER_LANG}' => $lang_dir // this bastard forces us to make a copy for every language that is installed, not just those with an actual i18'd imageset! + ); + + $sql = 'SELECT image_name, image_filename, image_lang, image_width, image_height + FROM ' . STYLES_IMAGESET_DATA_TABLE . ' + WHERE imageset_id = ' . $theme['imageset_id'] . " + AND image_filename <> '' + AND image_lang IN ('" . $db->sql_escape($user_image_lang) . "', '')"; + $result2 = $db->sql_query($sql); + + $img_array = array(); + while ($row = $db->sql_fetchrow($result2)) + { + $img_array[$row['image_name']] = $row; + } + $db->sql_freeresult($result2); + + $specific_theme_data = str_replace(array_keys($replace), array_values($replace), $theme['theme_data']); + + $matches = array(); + preg_match_all('#\{IMG_([A-Za-z0-9_]*?)_(WIDTH|HEIGHT|SRC)\}#', $specific_theme_data, $matches); + + $imgs = $find = $replace = array(); + if (isset($matches[0]) && sizeof($matches[0])) + { + foreach ($matches[1] as $i => $img) + { + $img = strtolower($img); + $find[] = $matches[0][$i]; + + if (!isset($img_array[$img])) + { + $replace[] = ''; + continue; + } + + if (!isset($imgs[$img])) + { + $img_data = &$img_array[$img]; + $imgsrc = ($img_data['image_lang'] ? $img_data['image_lang'] . '/' : '') . $img_data['image_filename']; + $imgs[$img] = array( + 'src' => $phpbb_root_path . 'styles/' . $theme['imageset_path'] . '/imageset/' . $imgsrc, + 'width' => $img_data['image_width'], + 'height' => $img_data['image_height'], + ); + } + + switch ($matches[2][$i]) + { + case 'SRC': + $replace[] = $imgs[$img]['src']; + break; + + case 'WIDTH': + $replace[] = $imgs[$img]['width']; + break; + + case 'HEIGHT': + $replace[] = $imgs[$img]['height']; + break; + + default: + continue; + } + } + + if (sizeof($find)) + { + $specific_theme_data = str_replace($find, $replace, $specific_theme_data); + } + } + file_put_contents($phpbb_root_path . '/store/' . $theme['theme_id'] . '_' . $theme['imageset_id'] . '_' . $lang_dir . '.css', $specific_theme_data, LOCK_EX); + } + } + $db->sql_freeresult($result); + } /** $reqd_template = (isset($installcfg['required_template'])) ? $installcfg['required_template'] : false; diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 3ef369aacf..ff16616863 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -3416,7 +3416,7 @@ function page_header($page_title = '', $display_online_list = true) 'T_ICONS_PATH' => PHPBB_ROOT_PATH . $config['icons_path'] . '/', 'T_RANKS_PATH' => PHPBB_ROOT_PATH . $config['ranks_path'] . '/', 'T_UPLOAD_PATH' => PHPBB_ROOT_PATH . $config['upload_path'] . '/', - 'T_STYLESHEET_LINK' => (!$user->theme['theme_storedb']) ? PHPBB_ROOT_PATH . 'styles/' . $user->theme['theme_path'] . '/theme/stylesheet.css' : PHPBB_ROOT_PATH . 'style.' . PHP_EXT . "?sid=$user->session_id&id=" . $user->theme['style_id'] . '&lang=' . $user->data['user_lang'], + 'T_STYLESHEET_LINK' => (!$user->theme['theme_storedb']) ? PHPBB_ROOT_PATH . 'styles/' . $user->theme['theme_path'] . '/theme/stylesheet.css' : PHPBB_ROOT_PATH . 'style.' . PHP_EXT . "?sid=$user->session_id&id=" . $user->theme['style_id'] . '&lang=' . $user->data['user_lang'], //"{$phpbb_root_path}store/{$user->theme['theme_id']}_{$user->theme['imageset_id']}_{$user->lang_name}.css" 'T_STYLESHEET_NAME' => $user->theme['theme_name'], 'SITE_LOGO_IMG' => $user->img('site_logo')) |