Cachen der Jumpbox.
Die Jumpbox wird auf vielen phpBB-Seiten angezeigt und jedesmall dynamisch erzeugt. Dies ist jedoch unnötig und kann wesentlich beschleunigt werden.
Persönlich nutze ich sie nie, und vielen anderen fällt sie auch nie auf, die Jumpbox. Das ist das kleine Drop-Down unten links, das auf vielen phpBB-Seiten zu sehen ist und mit dem man ganz schnell in ein anderen Forum wechseln kann.
Zur Darstellung der Jumpbox benötigt phpBB zwei Datenbankabfragen, die wir uns eigentlich beide schenken können: sie zielen auf die Tabellen phpbb_categories und phpbb_forums, die sich - jedenfalls was die Daten für die Jumpbox angeht - nur ändern, wenn wir ein neues Forum erstellen, ein Forum umbenennen oder die Reihenfolge ändern. Auf deutsch: bei jeder Erzeugung der Jumpbox holen wir die immer gleichen Daten aus der Datenbank.
Wir wollen uns diese Arbeit ersparen und die Erstellung der Jumpbox beschleunigen.
Aufgrund der Flexibiltät der Funktion make_jumpbox() müssen wir dabei etwas tricksen.
Hier die neue Version der Funktion, durch die die alte (includes/functions.php, Zeile 117 ff.) vollständig zu ersetzen ist:
Code: | function make_jumpbox($action, $match_forum_id = 0, $use_cache = true, $show_template = true)
{
global $phpbb_root_path, $template, $userdata, $lang, $db, $nav_links, $phpEx, $SID;
if ($use_cache && $match_forum_id == 0 && file_exists($phpbb_root_path . 'cache/jumpbox_boxstring.data'))
{
$boxstring = unserialize(implode("", file($phpbb_root_path . 'cache/jumpbox_boxstring.data')));
}
else
{
if ($use_cache && file_exists($phpbb_root_path . 'cache/jumpbox_categories.data'))
{
$category_rows = unserialize(implode("", file($phpbb_root_path . 'cache/jumpbox_categories.data')));
}
else
{
// $is_auth = auth(AUTH_VIEW, AUTH_LIST_ALL, $userdata);
$sql = "SELECT c.cat_id, c.cat_title, c.cat_order
FROM " . CATEGORIES_TABLE . " c, " . FORUMS_TABLE . " f
WHERE f.cat_id = c.cat_id
GROUP BY c.cat_id, c.cat_title, c.cat_order
ORDER BY c.cat_order";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, "Couldn't obtain category list.", "", __LINE__, __FILE__, $sql);
}
$category_rows = array();
while ( $row = $db->sql_fetchrow($result) )
{
$category_rows[] = $row;
}
$cache = fopen($phpbb_root_path . 'cache/jumpbox_categories.data', 'w');
fwrite($cache, serialize($category_rows));
fclose($cache);
}
if ( $total_categories = count($category_rows) )
{
if ($use_cache && file_exists($phpbb_root_path . 'cache/jumpbox_forums.data'))
{
$forum_rows = unserialize(implode("", file($phpbb_root_path . 'cache/jumpbox_forums.data')));
}
else
{
$sql = "SELECT *
FROM " . FORUMS_TABLE . "
ORDER BY cat_id, forum_order";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not obtain forums information', '', __LINE__, __FILE__, $sql);
}
$forum_rows = array();
while ( $row = $db->sql_fetchrow($result) )
{
$forum_rows[] = $row;
}
$cache = fopen($phpbb_root_path . 'cache/jumpbox_forums.data', 'w');
fwrite($cache, serialize($forum_rows));
fclose($cache);
}
$boxstring = '<select name="' . POST_FORUM_URL . '" onchange="if(this.options[this.selectedIndex].value != -1){ forms[\'jumpbox\'].submit() }"><option value="-1">' . $lang['Select_forum'] . '</option>';
if ( $total_forums = count($forum_rows) )
{
for($i = 0; $i < $total_categories; $i++)
{
$boxstring_forums = '';
for($j = 0; $j < $total_forums; $j++)
{
if ( $forum_rows[$j]['cat_id'] == $category_rows[$i]['cat_id'] && $forum_rows[$j]['auth_view'] <= AUTH_REG )
{
// if ( $forum_rows[$j]['cat_id'] == $category_rows[$i]['cat_id'] && $is_auth[$forum_rows[$j]['forum_id']]['auth_view'] )
// {
$selected = ( $forum_rows[$j]['forum_id'] == $match_forum_id ) ? 'selected="selected"' : '';
$boxstring_forums .= '<option value="' . $forum_rows[$j]['forum_id'] . '"' . $selected . '>' . $forum_rows[$j]['forum_name'] . '</option>';
//
// Add an array to $nav_links for the Mozilla navigation bar.
// 'chapter' and 'forum' can create multiple items, therefore we are using a nested array.
//
$nav_links['chapter forum'][$forum_rows[$j]['forum_id']] = array (
'url' => append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=" . $forum_rows[$j]['forum_id']),
'title' => $forum_rows[$j]['forum_name']
);
}
}
if ( $boxstring_forums != '' )
{
$boxstring .= '<option value="-1"> </option>';
$boxstring .= '<option value="-1">' . $category_rows[$i]['cat_title'] . '</option>';
$boxstring .= '<option value="-1">----------------</option>';
$boxstring .= $boxstring_forums;
}
}
}
$boxstring .= '</select>';
}
else
{
$boxstring .= '<select name="' . POST_FORUM_URL . '" onchange="if(this.options[this.selectedIndex].value != -1){ forms[\'jumpbox\'].submit() }"></select>';
}
if ( !empty($SID) )
{
$boxstring .= '<input type="hidden" name="sid" value="' . $userdata['session_id'] . '" />';
}
if ($match_forum_id == 0)
{
$cache = fopen($phpbb_root_path . 'cache/jumpbox_boxstring.data', 'w');
fwrite($cache, serialize($boxstring));
fclose($cache);
}
}
if ($show_template)
{
$template->set_filenames(array(
'jumpbox' => 'jumpbox.tpl')
);
$template->assign_vars(array(
'L_GO' => $lang['Go'],
'L_JUMP_TO' => $lang['Jump_to'],
'L_SELECT_FORUM' => $lang['Select_forum'],
'S_JUMPBOX_SELECT' => $boxstring,
'S_JUMPBOX_ACTION' => append_sid($action))
);
$template->assign_var_from_handle('JUMPBOX', 'jumpbox');
}
return;
} |
Gecacht werden sowohl die komplette Jumpbox als auch die beiden Datenbankabfragen. Das ist nötig, weil die Jumpbox es zulässt, ein Forum als aktuelles Forum anzuzeigen. Bei diesen Aufrufen können wir also nicht die Standard-Jumpbox benutzen, sondern bauen dann mit den gecachten Datenbankabfragen die Jumpbox neu zusammen.
Wird die Funktion nun aufgerufen so wird immer auf die gecachten Ergebnisse zurückgeriffen, es sei denn, $use_cache würde explizit auf false gesetzt oder die Cache-Dateien existierten nicht.
Spätestens nach dem ersten Aufruf der Funktion existieren diese Dateien jedoch, so daß wir nun noch dafür sorgen müssen, das die Caches auf Änderungen in der Forenstruktur achten. Dazu müssen wir die admin_forums.php anpassen. In Zeile 918 wird ein Aufruf der Funktion make_jumpbox() eingeschoben:
Code: | #
#-----[ OPEN ]------------------------------------------
#
admin/admin_forums.php
#
#-----[ FIND ]------------------------------------------
#
if ($show_index != TRUE)
{
include('./page_footer_admin.'.$phpEx);
exit;
}
#
#-----[ BEFORE, ADD ]------------------------------------------
#
make_jumpbox('action', 0, false, false);
|
Damit das ganze funktioniert, benötigen wir ein Verzeichnis, nämlich /phpBB2/cache, dessen Zugriffsrechte auf 777 eingestellt werden sollten bzw. so, das der Webserver in dem Verzeichnis schreiben kann.
PS: Eventuell könnte man noch das ganze noch so umschreiben, das bei einem Fehler durch unserialize keine Fehlermeldungen entstehen sondern wir einfach ohne Cache weitermachen.
|