IPB-SDK, les guests et le cache

Ayant recodé le système de débug pour mon site, j'ai analysé les requêtes MySQL. J'ai effectué l'analyse logué en membre et délogué comme simple invité. La logique voudrait qu'un membre demande plus de requête du fait qu'il interroge sa boite de message privé, récupère ses infos, etc. Hors sous IPB-SDK c'est l'inverse.

Le listing des requêtes faite ressortir une requête identique qui se répète plusieurs fois (5 fois dans mon cas) :

[sql]
SELECT m.*, me.signature, me.avatar_size, me.avatar_location, me.avatar_type, me.vdirs,
me.location, me.msnname, me.interests, me.yahoo, me.website, me.aim_name, me.icq_number,
g.*, cf.*
FROM ibf_members m
LEFT JOIN ibf_groups g ON (m.mgroup=g.g_id)
LEFT JOIN ibf_pfields_content cf ON (cf.member_id=m.id)
LEFT JOIN ibf_member_extra me ON (me.id=m.id)
WHERE m.id='0'

Le constat est rapide. Il n'y a pas de membre à l'id = 0. La requête retourne rien donc alimente le cache avec rien. De ce fait une interrogation du cache ne retourne rien et ré-effectue la requête. La fonction concernée par ce problème et la fonction get_advinfo() que j'ai redéfinie pour qu'elle tienne compte des invités.

[php]
/**
* Grabs detailed information on a member.
* Modification : Gestion des guest.
* @author Guillaume Kulakowski <guillaume_AT_llaumgui_DOT_com>
* @author Pita (conversion to 2.0) <peter@randomnity.com>
* @author Cow <khlo@global-centre.com>
* @param integer $memberid
* @return array Member Information, or FALSE on failure
* @see get_info(),get_avatar(),get_raw_sig(),get_photo(),get_member_pips(),get_member_icon(),get_num_new_posts(),get_skin_id()
*/
function get_advinfo($memberid = '') {

if (!$memberid)
  { $memberid = $GLOBALS['ibforums']->member['id']; }

// Gestion des guests non présentes de base ! :
if ( empty($memberid) || $memberid == 0 )
  { return false; }
else if ($cache = $this->get_cache('get_advinfo', $memberid))
  { return $cache; }
else
  {
   $this->DB->query ("SELECT m.*, me.signature, me.avatar_size, me.avatar_location, me.avatar_type, me.vdirs,
me.location, me.msnname, me.interests, me.yahoo,
me.website, me.aim_name, me.icq_number,
g.*, cf.*
FROM ibf_members m
LEFT JOIN ibf_groups g ON (m.mgroup=g.g_id)
LEFT JOIN ibf_pfields_content cf ON (cf.member_id=m.id)
LEFT JOIN ibf_member_extra me ON (me.id=m.id)
WHERE m.id='" . intval($memberid) . "'");
   if ($this->DB->get_num_rows())
    {
     $info = $this->DB->fetch_row();
     $this->save_cache('get_advinfo', $memberid, $info);
    return $info;
    }
   else
    { return FALSE; }
  }
}

Dans le cas d'XPerience-Fr, cette fonction étant utilisée plusieurs fois, j'économise ainsi 5 requêtes MySQL sur la page d'accueil. Vous pouvez en gagner plus ou moins selon votre code.

Attribution - Partage dans les Mêmes Conditions 4.0 International