<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Awelty : société de création de site - Référencement - Amiens, Somme, Picardie &#187; cache php</title>
	<atom:link href="http://www.awelty.fr/tag/cache-php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.awelty.fr</link>
	<description>Agence web à Amiens</description>
	<lastBuildDate>Fri, 16 Dec 2011 17:00:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>[PHP] Mise en cache d&#8217;un tableau de données SQL</title>
		<link>http://www.awelty.fr/developpement-web/php-mise-en-cache-d-un-tableau-de-donnees-sql/</link>
		<comments>http://www.awelty.fr/developpement-web/php-mise-en-cache-d-un-tableau-de-donnees-sql/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 19:00:00 +0000</pubDate>
		<dc:creator>Tony Samson</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[cache php]]></category>
		<category><![CDATA[mise en cache]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.awelty.fr/v5/e-monsite/php-mise-en-cache-d-un-tableau-de-donnees-sql/</guid>
		<description><![CDATA[Pour faire suite à mon billet sur l&#8217;optimisation PHP/SQL d&#8217;un site web, voici une méthode pour mettre en cache des données issues d&#8217;une requête SQL de type SELECT. Php propose deux fonctions aussi puissantes qu&#8217;utiles (mais aussi méconnues) : serialize et unserialize. Serialialize compresse (linéarise) un tableau Php Unserialize le décompresse (ou délinéarise), tout simplement. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Pour faire suite à mon billet sur l&#8217;<a href="/index.php?post/2008/04/09/Des-pistes-pour-optimiser-les-performances-dacces-dun-site-web">optimisation PHP/SQL d&#8217;un site web</a>, voici une méthode pour mettre en cache des données issues d&#8217;une requête SQL de type SELECT.</p>
<p>Php propose deux fonctions aussi puissantes qu&#8217;utiles (mais aussi méconnues) : serialize et unserialize.</p>
<ul>
<li><a href="http://fr.php.net/serialize">Serialialize</a> compresse (<em>linéarise</em>) un tableau Php</li>
<li><a href="http://fr.php.net/manual/fr/function.unserialize.php">Unserialize</a> le décompresse (ou <em>délinéarise</em>), tout simplement.</li>
</ul>
<p style="text-align: justify;"><strong>A partir de là, l&#8217;idée paraît s&#8217;imposer d&#8217;elle même : </strong>pour certaines requêtes qui sont énormément exécutées et/ou qui sont très lourdes (par exemple les données d&#8217;un membre utilisées sur toutes les pages d&#8217;un site), pourquoi ne pas mettre en cache le tableau issu d&#8217;un mysql_fetch_array() ? Ainsi, une fois que la requête a été exécuté on n&#8217;accède plus à la base de donnée, on récupère le tableau de données dans un fichier texte puis on le décompresse.</p>
<p>La première fonction permet, tout simplement, d&#8217;écrire dans un fichier (en le créant, le cas échéant) :</p>
<p><code>&lt;?<br />
function maj_fichier($file,$valeur)<br />
{<br />
$fp = fopen("$file","w+"); // ouverture du fichier en écriture (on le créé s'il n'existe pas)<br />
fputs($fp, $valeur); // on écrit dans le fichier<br />
fclose($fp);<br />
}<br />
?&gt;</code></p>
<p>La seconde &#8211; et c&#8217;est la fonction qui nous intéresse &#8211; est la fonction de mise en cache :</p>
<p>(pour l&#8217;utiliser vous aurez besoin de la fonction maj_fichier() ci-dessus et de la fonction requete_sql disponible sur <a href="/index.php?post/2008/07/23/4-fonctions-php-pour-effectuer-des-requetes-SQL">ce billet</a>)</p>
<p><code>&lt;?<br />
function MiseEnCache($nomFichier,$table,$where,$champs)<br />
{</code></p>
<p>if(file_exists($nomFichier)) // si les variables sont en cache<br />
{<br />
$requete = unserialize(lire_fichier($nomFichier)); // on utilise le fichier cache (unserialize = decompresser le tableau)<br />
}<br />
else // sinon on fait la requete sql<br />
{<br />
$requete = requete_sql($table, $champs, $where);<br />
maj_fichier($nomFichier, serialize($requete)); // on place le resultat du tableau dans un fichier (serialize = compresser le tableau)<br />
}</p>
<p>return $requete;<br />
}<br />
?&gt;</p>
<p>Exemple d&#8217;utilisation :</p>
<p><code>&lt;?<br />
$req_membre=MiseEnCache("/cache/membres/membre-".$id_membre.".txt","membres", "id='$id_membre'", "prenom,nom,date_inscription,login");</code></p>
<p>echo&nbsp;&raquo;Bienvenue &laquo;&nbsp;.$req_membre[prenom].&nbsp;&raquo; &laquo;&nbsp;.$req_membre[nom].&nbsp;&raquo; !&nbsp;&raquo;;<br />
?&gt;</p>
<p style="text-align: justify;">Cet exemple permet de pouvoir afficher sur toutes les pages le prénom et le nom du membre en effectuant la requête qu&#8217;une seule fois ! Malin n&#8217;est-ce pas ?</p>
<p style="text-align: justify;">Mais bien sur vous-vous dites : et si le membre modifie son nom, l&#8217;information sera erronée ?</p>
<p style="text-align: justify;">La réponse est simple : il suffit de supprimer le fichier texte lors de la modification des informations pour le régénérer avec les bonnes !!</p>
<p style="text-align: justify;">Il y a néanmoins une limitation à l&#8217;utilisation de ce procédé : ne l&#8217;utilisez pas pour des données sensibles (mot de passe, email, etc.) car un fichier texte est beaucoup plus facilement accessible pour un pirate qu&#8217;une base de données&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.awelty.fr/developpement-web/php-mise-en-cache-d-un-tableau-de-donnees-sql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

