Derniers articles

Catégories

Bash Jquery Linux php PluXml Proxy Raspberry Pi ssh Tools Tunnel Unix


Du cache pour PluXml

11 octobre 2012

PLuXml est vraiment très rapide. Mais sur un mini pc à base d'arm rien n'est jamais asser léger. Un cache des parties les plus lourdes à calculer parait logique.

La fonction ob_start() de php est parfaite pour cela. Les scripts de créations de cache ne manques pas et on ne va donc pas réinventer la roue. Un script trouver sur amoweb.fr fait exactement ce que je cherche, ne reste plus qu'à l'intégrer à PluXml.

Voici pour commencer le fichier staticcache.php que l'on va utiliser. Posé le dans le dossier racine de PluXml.

<?php

if(!@opendir(PLX_ROOT.'plxCache/')) mkdir(PLX_ROOT.'plxCache/');

class plxCache
{	
	//Trouver une technique pour trouve s'il y a eu une modification
	function startCache($name, $plxMotor)
	{
		//Génère un nom de fichier pour la cache, variable en fonction de modifications :
		$filecache = filemtime(PLX_ROOT.$plxMotor->aConf['racine_commentaires'])
								. '-' . filemtime(PLX_ROOT.$plxMotor->aConf['racine_articles']) . '_' . $name . '_cache.tmp';

		//Le fichier cache existe déjà on l'affiche
		if(file_exists(PLX_ROOT.'plxCache/'.$filecache))
		{
		    $cache = fopen(PLX_ROOT.'plxCache/'.$filecache,"r");
		    while (!feof($cache)) echo fgets($cache, 2048);
		    fclose($cache);
			return 0;
		}
		else
		{
			//On supprime l'ancien fichier cache :
			$filesCache = glob(PLX_ROOT.'plxCache/*_'. $name . '_cache.tmp', GLOB_MARK );
			foreach($filesCache as $fileToDelete ) {@unlink($fileToDelete);}
			
			//On lance la caching		
        	ob_start();
			return 1;
		}
	}

	function stopCache($name, $plxMotor)
	{
		$filecache = filemtime(PLX_ROOT.$plxMotor->aConf['racine_commentaires'])
								. '-' . filemtime(PLX_ROOT.$plxMotor->aConf['racine_articles']) . '_' . $name . '_cache.tmp';

		//Le fichier existe déjà, il a donc déjà été affiché :
		if(file_exists(PLX_ROOT.'plxCache/'.$filecache)) return;

		//On récupère le contenu du cache
		$cachecontent = ob_get_contents();
        ob_end_clean();
		//On affiche le cache
        echo $cachecontent;
		//On sauvegarde le cache dans un fichier
        $cache = fopen(PLX_ROOT.'plxCache/'.$filecache, "w");
        fwrite($cache, $cachecontent);
        fclose($cache);
		
	}
}
?>

Il faut maintenant l'intégrer dans notre site, les parties les plus lourdes à calculer sont les listes des articles des pages home, tag, catégorie. Il me parait également interressant de conserver en cache le menu

Pour les pages home, tags et catégories l'intégration est vraiment simple, il faut juste se veiller à ce qu'il y ai un cache pour chaque numéro de page (pagination). Voici un exemple d'intégration dans le fichier home.php de mon template, les lignes ajoutées sont les lignes 5,6 et 14.

<div id="article">
		

			<?php
				include_once(PLX_ROOT.'themes/'.$plxMotor->style.'/staticcache.php');
				if(plxCache::startCache($plxShow->plxMotor->page.'home', $plxMotor)) { 
				while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
				<h2><?php $plxShow->artTitle('link'); ?></h2>
				<p class="art-topinfos"><?php $plxShow->artDate('#num_day #month #num_year(4) #hour:#minute'); ?></p>
				<div class="art-chapo"><?php $plxShow->artChapo(); ?></div>
				<p class="art-infos"><?php $plxShow->lang('CLASSIFIED_IN') ?> : <?php $plxShow->artCat(); ?> - <?php $plxShow->lang('TAGS') ?> : <?php $plxShow->artTags(); ?> - <?php $plxShow->artNbCom(); ?></p>
				<hr class="interart">
			<?php endwhile; 
				} plxCache::stopCache($plxShow->plxMotor->page.'home', $plxMotor);
			?>
		
			<p id="pagination"><?php $plxShow->pagination(); ?></p>

</div>

Les modifications se trouvent dans les deux lignes avant la boucle while, et la ligne après endwhile; .

Il suffit de faire la même modification dans les fichiers gérant l'affichage des catégories et celui des tags.


Pour ce qui est du menu c'est un peu différent car il faut autant de cache de menu qu'il y a de pages dans votre site. En effet pluxml rajoute une classe "active" pour la page courante, conserver cette information nous oblige à imaginer un nom unique pour chaque page. L'url d'une page est unique, on va donc utiliser ceci pour nommer nos fichiers caches. Je n'ai pas trouver de classe native à pluxml permettant de faire ceci, je récupère donc cette infos via les outils standard de php. Voici la modification du fichier sidebar.php ou équivalent, les lignes ajoutées sont les lignes 3,4,5 et 35.

<?php if(!defined('PLX_ROOT')) exit; ?>
<?php
$monUrl = basename($_SERVER['REQUEST_URI']);  
include_once(PLX_ROOT.'themes/'.$plxMotor->style.'/staticcache.php');
if(plxCache::startCache($monUrl.'sidebar', $plxMotor)) {
?>

	<div id="aside">

		<h3><?php $plxShow->lang('CATEGORIES') ?></h3>
		<ul>
			<?php $plxShow->catList('','<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a> (#art_nb)</li>'); ?>
		</ul>

		<h3><?php $plxShow->lang('LAST_ARTICLES') ?></h3>
		<ul>
			<?php $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>'); ?>
		</ul>

        <h3><?php $plxShow->lang('TAGS') ?></h3>
		<ul>
			<?php $plxShow->tagList('<li class="#tag_status"><a href="#tag_url" title="#tag_name">#tag_name</a></li>', 20); ?>
		</ul>
		
		<h3><?php $plxShow->lang('LAST_COMMENTS') ?></h3>
		<ul>
			<?php $plxShow->lastComList('<li><a href="#com_url">#com_author '.$plxShow->getLang('SAID').' : #com_content(34)</a></li>'); ?>
		</ul>
		
		<h3><?php $plxShow->lang('ARCHIVES') ?></h3>
        <ul>
            <?php $plxShow->archList('<li id="#archives_id" class="#archives_status"><a href="#archives_url" title="#archives_name">#archives_name</a> (#archives_nbart)</li>'); ?>
        </ul>
	</div>
<?php } plxCache::stopCache($monUrl.'sidebar', $plxMotor); ?>

Pour encore accélérer ceci on peut déposer les fichiers caches dans un dossier en mémoire. Rien de plus simple, le script staticcache.php dépose les fichiers dans un dossier plxCache à la racine de PluXml. Il suffit donc de créer un dossier en mémoire puis de faire un lien symbolique pointant dans celui-ci:

sudo mount -t tmpfs -o size=4m none /mnt/tmpfs
mkdir tmpfs/plxCache
sudo ln -s /mnt/tmpfs/plxCache /var/www/"votre path--> racine template"/plxCache

Voila, le cache est maintenant en mémoire, Si vous voulez conserver ce système, ne pas oublier d'éditer le fichier /etc/fstab afin de recréer le dossier mémoire automatiquement après reboot.

tmpfs /"PATH TO plxCache DIR" tmpfs defaults,size=1M 0 0

Classé dans : Accueil, Divers - Mots clés : PluXml, php

Écrire un commentaire

Quelle est la première lettre du mot bztbz ? : 

Derniers articles

Catégories

Archives