Categories > TinyButStrong general (FR) >

MergeBlock ralenti mon appli

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: zeflex
Date: 2011-10-04
Time: 16:01

MergeBlock ralenti mon appli

Salut,

Je te parlais hier que ma page était assez longue à afficher pour mes problèmes en cours (désolé je risque de revenir souvent poser des questions, je suis sur la phase finale et il faut que tout marche asap de mon coté ^^).

Donc je viens déjà de trouver un bout de mon problème. A un endroit, je dois merger ceci :
$TBS->MergeBlock('pagination','num',array('min'=>1,'max'=>$nb_pages));
$nb_pages peut attendre 600 (ce qui affichera dans mon html, un bloc de petites div allant de 1 à 600 contenant des liens de 1 à 600) sans problèmes. Sans ce bloc là, j'obtiens une page affichée en 0.02s et avec le bloc je passe à 0.46s minimum.

Je cherchais du coté de mes requêtes sans succès mais non c'est plus ca qui me gêne qu'autre chose. Il y'a t'il une solution à mon problème ? Sachant que si je fais une boucle php plus importante qu'une incrémentation allant à 2000 ; j'obtiens tout de même un timing plus petit.

Merci.
By: Skrol29
Date: 2011-10-04
Time: 16:06

Re: MergeBlock ralenti mon appli

Salut,

Ces 600 lignes sont vites crées pour TBS. Ce qui ralenti la fusion doit surement se trouver à l’intérieur de ce bloc. Tu dois probablement fusionner des données couteuses en évaluation.
As-tu une bribe de code ?
By: zeflex
Date: 2011-10-04
Time: 16:17

Re: MergeBlock ralenti mon appli

Salut,

Le résultat en sortie est (raccourci bien sur) :
    <div class="pagination" style="text-align: left">
            Results by page :
            <select id="rbypage" name="rbypage" onchange="update_rbypage();">

            <option value="10" selected="selected">10</option><option value="25" >25</option><option value="50" >50</option><option value="100" >100</option><option value="200" >200</option><option value="250" >250</option>
            </select><br/><br/>
           
            Pages :
                <span class="current">
                1
                </span>
               
           
           
                <a href="?start=2&results_by_page=10&orderby=title">

                2
                </a>
               
           
           
                <a href="?start=3&results_by_page=10&orderby=title">
                3
                </a>
               
           
           
                <a href="?start=4&results_by_page=10&orderby=title">
                4
                </a>
               
           
           
                <a href="?start=5&results_by_page=10&orderby=title">
                5
                </a>

               
           
           
                <a href="?start=6&results_by_page=10&orderby=title">
                6
                </a>
               
           
           
                <a href="?start=7&results_by_page=10&orderby=title">
                7
                </a>
               
           
           
                <a href="?start=8&results_by_page=10&orderby=title">
                8
                </a>

...................

</div>


Et dans le HTML :
    <div class="pagination" style="text-align: left">
            Results by page :
            <select id="rbypage" name="rbypage" onchange="update_rbypage();">
            <option value="[rbypage.val;block=option]" [var.results_by_page; if [val] = [rbypage.val]; then 'selected="selected"'; else '']>[rbypage.val;block=option]</option>
            </select><br/><br/>
            [pagination;block=begin]
            [pagination.val;if [val] = '1' ; then 'Pages : '; else '']
                [var.current_page; if [val] = [pagination.val]; then '<span class="current">'; else '<a href="?start=[pagination.val]&results_by_page=[var.results_by_page][onshow.orderby; if [val] != ''; then '&orderby=[val]'; else '']">']
                [pagination.val]
                [var.current_page; if [val] = [pagination.val]; then '</span>'; else '</a>']
                [pagination.val;if [pagination.val;ope=mod:20] = 0; then '<br/><br/>'; else '']
            [pagination;block=end]
    </div>

Merci.
By: zeflex
Date: 2011-10-04
Time: 17:28

Re: MergeBlock ralenti mon appli

Re salut,

En fait effectivement j'ai d'autres blocs où pour traiter une quantité de donnée définie, mon temps d'affichage accroit drastiquement ... Je te mets ici le contenu entier de la page php et juste après les temps donnés en sortie ... Je sais plus où donner de la tête ...

PHP :
<?php
include_once('../common.php');
include_once('../../fonctions.php');
$start_time = microtime_float();

function db_query($query) {
    global $count_query;
    $count_query++;
    return mysql_query($query);
}

include_once('../../connect.php');

if ( isset($_GET['action']) && !empty($_GET['title_id']) ) {
    check_read_only('titles');
   
    function mass_del($varname,$tablename,$fieldname) {
        $table = str_replace('|','',explode('||',$varname));
        foreach( $table AS $key=>$value ) {
            db_query("DELETE FROM $tablename WHERE `$fieldname` = $value");
        }
    }
   
    $title_id = intval($_GET['title_id']);
    $sql = db_query("SELECT * FROM titles WHERE title_id = $title_id");
    $row = mysql_fetch_array($sql);
    $categories = $row['categories'];
    $original_languages = $row['origin_country'];
   
    mass_del($original_languages,'languages','lang_id');
   
    db_query("DELETE FROM titles_formats WHERE title_id = $title_id");
    db_query("DELETE FROM availabilities WHERE title_id = $title_id");
    db_query("DELETE FROM sales WHERE title_id = $title_id");
    db_query("DELETE FROM external_links WHERE title_id = $title_id");
    db_query("DELETE FROM titles WHERE title_id = $title_id");
    mysql_close();
    echo '<script type="text/javascript">$("#tr'.$title_id.'").fadeOut();</script>';
    exit();
}

$pagename = 'Titles';

tbs_rbypage(); tbs_top_links();

if ( !empty($_POST) ) {
    $error = '';
    $query = 'SELECT A.*,B.lang_en AS original_lang_en,C.studioname AS studioname FROM titles AS A
    LEFT JOIN languages AS B ON B.lang_id = A.language
    LEFT JOIN studios AS C ON C.studio_id = A.studio
    WHERE ';
    foreach($_POST AS $key=>$value) {
        $$key = mysql_real_escape_string(trim($value));
        if ( $key == 'format_id' && !empty($value) ) {
            $results = array();
            $sub_sql = db_query("SELECT title_id FROM titles_formats WHERE format = $value");
            if ( !mysql_num_rows($sub_sql) ) {
                $error = 'No results founded';
            }
            while( $sub_row = mysql_fetch_array($sub_sql) ) {
                $query.= "title_id = ".$sub_row['title_id']." OR ";
            }
            $query = substr($query,0,strlen($query)-3)."AND ";
        }
        if ( empty($error) && !empty($$key) && $key != 'submit' ) {
            if ( $key == 'cat_id' )
            $key = 'categories';
            if ( $key == 'categories' )
            $query.= $key.' LIKE \'%|'.$cat_id.'|%\' AND ';
            elseif ( $key == 'from' )
            $query.= 'production_year >= '.$from.' AND ';
            elseif ( $key == 'to' )
            $query.= 'production_year <= '.$to.' AND ';
            elseif ( $key == 'studio_id' )
            $query.= $key.' = '.$$key.' AND ';
            elseif ( $key == 'volume' )
            $query.= $key.' = '.$$key.' AND ';
            elseif ( $key == 'keyword' )
            $query.= 'keywords_fr LIKE \'%'.$$key.'%\' OR keywords_en LIKE \'%'.$$key.'%\' AND ';
            elseif ( $key != 'format_id' )
            $query.= $key.' LIKE \'%'.$$key.'%\' AND ';
        }
    }
    $query = substr($query,0,strlen($query)-5);
    $query.= 'ORDER BY '.$orderby.' '.$desc.' LIMIT '.$start.','.$results_by_page;
    $TBS->MergeBlock('pagination',array());
    if ( strlen($query) == 217 ) {
        $query = $initial_query;
        $TBS->MergeBlock('pagination','num',array('min'=>1,'max'=>$nb_pages));
    }   
} else {
    // $TBS->MergeBlock('pagination','num',array('min'=>1,'max'=>$nb_pages));
}

$sql = db_query("SELECT count(title_id) AS total FROM titles");
$row = mysql_fetch_array($sql);
$total = $row['total'];
$nb_pages = ceil($total/$results_by_page);

if ( isset($_GET['orderby']) )
$orderby = mysql_real_escape_string($_GET['orderby']);
else
$orderby = 'title';

if ( isset($_GET['orderdesc']) )
$desc = 'DESC ';
else
$desc = '';

$results_by_page = 100;

$query = $initial_query = 'SELECT A.title_id,A.title_id_htaccess,A.title,A.img_url,A.production_year,B.lang_en AS original_lang_en,C.studioname AS studioname,E.format_en FROM titles AS A
LEFT JOIN languages AS B ON B.lang_id = A.language
LEFT JOIN studios AS C ON C.studio_id = A.studio
LEFT JOIN titles_formats AS D ON D.title_id = A.title_id
RIGHT JOIN formats AS E ON E.format_id = D.format
ORDER BY '.$orderby.' '.$desc.'
LIMIT '.$start.','.$results_by_page;

if ( $orderby == 'studio' )
$query = 'SELECT A.studioname AS studioname,B.title_id,B.title_id_htaccess,B.title,B.img_url,B.production_year,C.lang_en AS original_lang_en FROM studios AS A
RIGHT JOIN titles AS B ON B.studio = A.studio_id
LEFT JOIN languages AS C ON C.lang_id = B.language
ORDER BY '.$orderby.' '.$desc.'
LIMIT '.$start.','.$results_by_page;

$sql = db_query($query);

$cat_array = $languages = $formats = array();

// Making concordance for categories
$sql_cat = db_query("SELECT * FROM categories");
while ($row_cat = mysql_fetch_array($sql_cat)) {
    $cat_array[$row_cat['cat_id']] = $row_cat['cat_en'];
}
$cat_display = array();

while ( $row = mysql_fetch_array($sql)) {
    $title_id = $row['title_id'];
    // Making concordance for categories
    $categories = str_replace('|','',explode('||',$row['categories']));
    $cat_name = '';
    foreach($categories AS $key=>$val) {
        if ( isset($cat_array[$val]) )
        $cat_name.= $cat_array[$val].'<br/>';
    }
    $cat_name = substr($cat_name,0,-5);
    array_push($cat_display,$cat_name);
   
          //\\ MULTIPLES FORMATS AND LANGUAGES !
         //  \\ MULTIPLES FORMATS AND LANGUAGES !
        //    \\ MULTIPLES FORMATS AND LANGUAGES !
       //      \\ MULTIPLES FORMATS AND LANGUAGES !
      //   !!!  \\ MULTIPLES FORMATS AND LANGUAGES !
     //          \\ MULTIPLES FORMATS AND LANGUAGES !
    //____________\\ MULTIPLES FORMATS AND LANGUAGES !
   
    // Making concordance for formats
    // $formats_string = '';
    // $sql_formats = db_query("SELECT B.format_en FROM titles_formats AS A LEFT JOIN formats AS B ON B.format_id = A.format WHERE A.title_id = $title_id");
    // while($row_formats = mysql_fetch_array($sql_formats)) {
        // $formats_string.= $row_formats['format_en'].'<br/>';
    // }
    // $format_string = substr($formats_string,0,-5);
    // array_push($formats,$formats_string);
   
    // Making concordance for languages
    // $lang_name = '';
    // $sql_languages = db_query("SELECT B.lang_en FROM titles_formats AS A LEFT JOIN languages AS B ON B.lang_id = A.language WHERE A.title_id = $title_id");
    // while ($row_languages = mysql_fetch_array($sql_languages)) {
        // $lang_name.= $row_languages['lang_en'].'<br/>';
    // }
    // $lang_name = substr($lang_name,0,-5);
    // array_push($languages,$lang_name);
   
    // Making concordance for formats
    $formats_string = '';
    $langs_string = '';
    $sql_formats = db_query("SELECT B.format_en,C.lang_en FROM titles_formats AS A LEFT JOIN formats AS B ON B.format_id = A.format
    LEFT JOIN languages AS C ON C.lang_id = A.language WHERE A.title_id = $title_id");
    while($row_formats = mysql_fetch_array($sql_formats)) {
        $formats_string.= $row_formats['format_en'].'<br/>';
        $langs_string.= $row_formats['lang_en'].'<br/>';
    }
    $format_string = substr($formats_string,0,-5);
    $lang_string = substr($langs_string,0,-5);
    array_push($formats,$formats_string);
    array_push($languages,$lang_string);
   
    // Making concordance for languages
    // $lang_name = '';
    // $sql_languages = db_query("SELECT B.lang_en FROM titles_formats AS A LEFT JOIN languages AS B ON B.lang_id = A.language WHERE A.title_id = $title_id");
    // while ($row_languages = mysql_fetch_array($sql_languages)) {
        // $lang_name.= $row_languages['lang_en'].'<br/>';
    // }
    // $lang_name = substr($lang_name,0,-5);
    // array_push($languages,$lang_name);
}
$timing = microtime_float();
echo $timing = "<br/>nb query : $count_query | timing = ".($timing-$start_time);

$TBS->MergeBlock('titles','mysql',$query);
$timing = microtime_float();
echo $timing = "<br/>nb query : $count_query | timing = ".($timing-$start_time);

$TBS->MergeBlock('categories','array',$cat_display);
// echo "<br/><pre>".print_r($cat_display)."</pre>";
$timing = microtime_float();
echo $timing = "<br/>nb query : $count_query | timing = ".($timing-$start_time);

$TBS->MergeBlock('formats','array',$formats);
// echo "<br/><pre>".print_r($formats)."</pre>";
$timing = microtime_float();
echo $timing = "<br/>nb query : $count_query | timing = ".($timing-$start_time);

$TBS->MergeBlock('langs','array',$languages);
// echo "<br/><pre>".print_r($languages)."</pre>";

$timing = microtime_float();
echo $timing = "<br/>nb query : $count_query | timing = ".($timing-$start_time);
exit();

$txtfields = array('Keyword'=>'keyword','Title'=>'title','Cast'=>'cast','# Volume'=>'volume');
$TBS->MergeBlock('blk11',$txtfields);

$TBS->MergeBlock('formats_s','mysql','SELECT * FROM formats ORDER BY format_en');
$TBS->MergeBlock('categories_s','mysql','SELECT * FROM categories ORDER BY cat_en');
$TBS->MergeBlock('studios_s','mysql','SELECT * FROM studios ORDER BY studioname');

$txtfields = array('From'=>'from','To'=>'to');
$TBS->MergeBlock('blk13',$txtfields);

$radiofields = array('titles'=>"",'Titles'=>"",'Data Import'=>"",'Report'=>"",'Admin'=>"");
$TBS->MergeBlock('blk2',$radiofields);

$timing = microtime_float();
echo $timing = "<br/>nb query : $count_query | timing = ".($timing-$start_time);
exit();

$TBS->MergeField('timing',$timing);

$TBS->Show();
?>

En sortie :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/ndd/www/vvs/admin/pages/titles.php on line 181

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/ndd/www/vvs/admin/pages/titles.php on line 181

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/ndd/www/vvs/admin/pages/titles.php on line 181

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/ndd/www/vvs/admin/pages/titles.php on line 181

nb query : 103 | timing = 1.51571106911
nb query : 103 | timing = 1.89339399338
nb query : 103 | timing = 3.30427908897
nb query : 103 | timing = 4.4575510025
nb query : 103 | timing = 6.50980901718

Ne pas tenir compte des premiers warning. Une idée pour améliorer la sauce ... ?
By: Skrol29
Date: 2011-10-04
Time: 23:56

Re: MergeBlock ralenti mon appli

Salut,

Effectivement ton bloc "pagination" de ton message de 16:17 contient des points de lenteur.
Avec autant de données à fusionner, il ne faut pas mettre de champ [var] directs ni de champs [onshow] à l'intérieur
du bloc, car ces champs seront multipliés par autant d’enregistrements avant d'être fusionnée, ce qui arrivera à la fin sur la méthode Show();

C.f. la FAQ :
http://www.tinybutstrong.com/support.php#faq_slow

Tu dois donc éradiquer ces champs de ton bloc "pagination".
Je vois aussi que tu utilise facilement les paramètres "if"/"then"/"else" avec du contenu HTML. Tu auras des meilleurs performances si tu utilises les sections conditionnelles de bloc

http://www.tinybutstrong.com/fr/manual.php#html_conditional
By: zeflex
Date: 2011-10-05
Time: 16:32

Re: MergeBlock ralenti mon appli

Salut,

Merci de ta réponse.

J'ai eu beau relire à plusieurs reprises ce que tu m'as donné et fais divers tests mais quelque chose doit m'échapper car je n'arrives pas à quoi que ce soit de concret. J'avoues même que je suis perdu dans la logique du moteur de template (c'est la première fois que j'en utilises un).

Je ne peux pas passer plus de temps à faire divers tests pour essayer de comprendre par moi-même car j'ai d'autres sections à finaliser hormis celle ci donc est ce que tu pourrais m'aiguiller d'une manière plus directe stp ? Ca me ferait gagner énormément de temps (je suis en retard et c'est pas ton problème oui je sais ;))

Merci à toi.
By: Skrol29
Date: 2011-10-05
Time: 17:47

Re: MergeBlock ralenti mon appli

Salut,

> Je ne peux pas passer plus de temps à faire divers tests pour essayer de comprendre par moi-même

Ha-là-là, mais c'est un support TBS ici, pas du crowdsourcing.

Voici tout de même un équivalent de ton bout de template sur le bloc "pagination", mais ultra-rapide.

HTML :
Pages : [pagination.#]
<span class="current">[pagination.val;block=span+span;when [pagination.val]=[special.current_page]]</span>
<span>[pagination.val;ope=mod:20,mok:0;magnet=span]<br><br></span>
<a href="?start=[pagination.val]&results_by_page=[special.results_by_page][special.orderby; if [val] != ''; then '&orderby=[val]'; else '']">[pagination.val;block=a+span;default]</a>
<span>[pagination.val;ope=mod:20,mok:0;magnet=span]<br><br></span>

Se fusionne avec le PHP suivant:

// fusion préalable des variables incluses dans le bloc
$tbs->MergeField('special', array(
    'current_page'=> $current_page,
    'orderby' => $orderby,
    'results_by_page' =>$results_by_page,
));
// fusion du bloc
$tbs->MergeBlock('pagination', 'num', array('min'=>1,'max'=>$nb_pages));

By: zeflex
Date: 2011-10-05
Time: 22:58

Re: MergeBlock ralenti mon appli

Salut à toi,

Oui je sais que c'est un forum de support ... je t'assures que je suis du genre à chercher des heures le pourquoi du comment de quelque chose quand ca ne fonctionnes pas mais là je t'avoues qu'il me manque du temps pour ca et il n'y a que sur ce forum que je peux trouver ... ton aide ;)

Donc en effet ta syntaxe fonctionne bien ; les temps d'affichage sont désormais corrects.

Merci à toi pour ton implication à résoudre mes soucis.
By: Skrol29
Date: 2011-10-06
Time: 00:33

Re: MergeBlock ralenti mon appli

Heu... je tiens à signaler que je ne suis pas impliqué.