Langsames MantisBT 1.3 beschleunigen

Ich habe gerade den Mantis Bug Tracker eines Kunden von Version 1.2 auf die letzte 1er Version 1.3.20 aktualisiert und musste feststellen, dass das Laden der Seiten extrem viel langsamer geworden ist.

Ursache

Zuerst hatte ich die Datenbankabfragen in Verdacht, doch diese sind nicht der Grund. Der Grund für die Langsamkeit sind 2 Javascript– und 2 CSS-Includes im HTML Kopf, die auf PHP-Dateien verweisen. Diese erzeugen dynamisches JS/CSS, aber initialisieren ihrerseits wieder den kompletten MantisBT-Stack. Statt also PHP einmal zu durchlaufen wie vorher, muss es nun 5x durchlaufen werden, und um genau diesen Faktor fühlt sich MantisBT 1.3 auch langsamer an als ältere Versionen.

Lösung

Ich habe daraufhin die dynamischen Teile so umgeschrieben, dass sie inline mit der eigentlichen HTML-Seite ausgegeben werden und nicht mehr dynamisch nachgeladen werden müssen. Damit ist MantisBT 1.3 dann auch wieder so schnell wie frühere Versionen.

Und so müsst ihr vorgehen:

Bearbeitet die Datei html_api.php aus dem Mantis Hauptverzeichnis.

In der Funktion html_head_javascript() ersetzt ihr direkt die ersten zwei echo’s mit folgendem Block:

PHP
    /* @since 2023/11/16 itscz.org this slows down page loading dramatically, so place that JS inline instead
    echo "\t" . '<script type="text/javascript" src="' . helper_mantis_url( 'javascript_config.php' ) . '"></script>' . "\n";
    echo "\t" . '<script type="text/javascript" src="' . helper_mantis_url( 'javascript_translations.php' ) . '"></script>' . "\n";
    */
    html_head_javascript_inline_dynamic_parts();

Dann fügt ihr unterhalb der Funktion diese komplett neue Funktion ein:

PHP
/**
 * Inline replacement for separately loaded scripts 'javascript_config.php' and 'javascript_translations.php'
 * @return void
 * @since 2023/11/16 itscz.org
 */
function html_head_javascript_inline_dynamic_parts() {
    require_api( 'config_api.php' );
    require_api( 'lang_api.php' );
    echo "\t<script type=\"text/javascript\">\n";

    /* stuff from javascript_config.php */
    echo "\tvar config = new Array();\n";
    foreach(array('calendar_js_date_format', 'icon_path', 'short_path') as $v) {
        echo "\tconfig['{$v}'] = '" . addslashes( config_get( $v ) ) . "';\n";
    }

    /* stuff from javascript_translations.php */
    echo "\tvar translations = new Array();\n";
    foreach(array('time_tracking_stopwatch_start', 'time_tracking_stopwatch_stop', 'loading') as $v) {
        echo "\ttranslations['{$v}'] = '" . addslashes( lang_get( $v ) ) . "';\n";
    }

    echo "\t</script>\n";
}

Damit seit ihr schonmal die zwei langsamen Javascript-Includes los. Nun noch das CSS. Bearbeitet dazu in der gleichen Datei die Funkton html_css() und ersetzt den Aufruf mit der common_config.php komplett durch diese 3 Zeilen:

PHP
    # @since 2023/11/16 itscz.org this slows down page loading dramatically, so place that CSS inline instead
    # html_css_link( 'common_config.php' );
    html_css_inline_dynamic_parts();

Weiter unten in derselben Funktion ist noch eine foreach-Schleife. Den Aufruf darin ersetzt ihr durch folgende Zeilen:

PHP
        # @since 2023/11/16 itscz.org skip loading 'status_config.php' as this is already build inline, see note above
        if ($t_stylesheet_path != 'status_config.php') html_css_link( $t_stylesheet_path );

Zu guter letzt fügt ihr unterhalb der Funktion html_css() diese komplett neue Funktion ein:

PHP
/**
 * Inline replacement for separately loaded styles 'common_config.php' and 'status_config.php'
 * @return void
 * @since 2023/11/16 itscz.org
 */
function html_css_inline_dynamic_parts() {
    require_api( 'config_api.php' );
    require_api( 'lang_api.php' );
    echo "\t<style type=\"text/css\">\n";

    /* stuff from common_config.php */
    echo "\tdiv.form-container fieldset.required:after {\n";
	echo "\t\tposition: absolute;\n";
    echo "\t\tmargin: -1.75em 0em 0em .5em;\n";
	echo "\t\tfont-size: 8pt;\n";
	echo "\t\tcontent: '* ".lang_get( 'required' )."';\n";
	echo "\t\tcolor: red;\n";
    echo "\t}\n";

    /* stuff from status_config.php */
    $t_referer_page = array_key_exists( 'HTTP_REFERER', $_SERVER )
        ? basename( parse_url( $_SERVER['HTTP_REFERER'], PHP_URL_PATH ) )
        : basename( __FILE__ );
    # We don't need custom status colors on login page, and this is
    # actually causing an error since we're not authenticated yet.
    if (!in_array($t_referer_page, array('login_page.php', 'signup_page.php', 'lost_pwd_page.php', 'account_update.php'))) {
        $t_status_string = config_get( 'status_enum_string' );
        $t_statuses = MantisEnum::getAssocArrayIndexedByValues( $t_status_string );
        $t_colors = config_get( 'status_colors' );
        $t_status_percents = auth_is_user_authenticated() ? get_percentage_by_status() : array();

        foreach( $t_statuses as $t_id => $t_label ) {
            $t_css_class = html_get_status_css_class( $t_id );

            # Status color class
            if( array_key_exists( $t_label, $t_colors ) ) {
                echo "\t." . $t_css_class
                    . " { background-color: {$t_colors[$t_label]}; }\n";
            }

            # Status percentage width class
            if( array_key_exists( $t_id, $t_status_percents ) ) {
                echo "\t." . str_replace( 'color', 'percentage', $t_css_class )
                    . " { width: {$t_status_percents[$t_id]}%; }\n";
            }
        }

        # Status legend width class
        $t_color_count = count( $t_colors );
        $t_color_width = ( $t_color_count > 0 ? ( round( 100/$t_color_count ) ) : 0 );
        echo "\t.status-legend-width { width: $t_color_width%; }\n";
    }
    
    echo "\t</style>\n";
}

Das wars. Ladet MantisBT in eurem Browser neu und ihr habt wieder die gewohnte Geschwindigkeit der alten Version.

Interesse an schnellem Hosting für MantisBT oder benötigt ihr spezielle Anpassungen bei Eurem Bug Tracker? Schreibt mich an.

Dieser Beitrag steht unter folgender Lizenz: CC BY-SA 4.0

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert