<?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>php-experts.org - développement php et internet &#187; opcode</title>
	<atom:link href="http://www.php-experts.org/tag/opcode/feed" rel="self" type="application/rss+xml" />
	<link>http://www.php-experts.org</link>
	<description>Ressources sur le développement internet, PHP/MySQL, Ajax, marketing online, référencement...</description>
	<lastBuildDate>Sun, 27 Jun 2010 23:09:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cache d&#8217;opcode: Alternative Php Cache (APC)</title>
		<link>http://www.php-experts.org/developpement-web/php-developpement-web/cache-dopcode-alternative-php-cache-apc-62</link>
		<comments>http://www.php-experts.org/developpement-web/php-developpement-web/cache-dopcode-alternative-php-cache-apc-62#comments</comments>
		<pubDate>Tue, 09 Dec 2008 17:23:58 +0000</pubDate>
		<dc:creator>Didier</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[accélérer site internet]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[opcode]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.php-experts.org/?p=62</guid>
		<description><![CDATA[Pour accélerer les performances d&#8217;un site internet, il existe de nombreuses pistes à suivre. Outre les recommandations d&#8217;optimisation de Yahoo, qui concernent surtout l&#8217;architecture d&#8217;une application Web, on peut aussi s&#8217;attaquer à des couches plus transparentes (et souvent complètement ignorées par les développeurs), comme l&#8217;étape de &#8220;compilation&#8221; du script en exécutable. Nous allons voir comment [...]]]></description>
			<content:encoded><![CDATA[<p>Pour accélerer les performances d&#8217;un site internet, il existe de nombreuses pistes à suivre. Outre les <a href="http://www.php-experts.org/developpement-web/yahoo-vous-aide-a-accelerer-votre-site-internet-8">recommandations d&#8217;optimisation de Yahoo</a>, qui concernent surtout l&#8217;architecture d&#8217;une application Web, on peut aussi s&#8217;attaquer à des couches plus transparentes (et souvent complètement ignorées par les développeurs), comme l&#8217;étape de &#8220;compilation&#8221; du script en exécutable. Nous allons voir comment APC (Alternative Php Cache) peut nous aider rapidement à <strong>accélérer des scripts php</strong>.<br />
<span id="more-62"></span></p>
<h2>L&#8217;opcode ?</h2>
<p>Oui, l&#8217;opcode. C&#8217;est le code généré par votre serveur Web (qui a dit <a href="http://www.php-experts.org/category/developpement-web/admin-serveur">Apache</a> ?) à partir de vos scripts PHP, après leur interprétation et leur compilation. Ce code est exécutable, et sa génération prend un certain temps. A chaque exécution d&#8217;un script, le serveur régénère cet opcode, perdant ainsi un temps précieux: quand votre script n&#8217;a pas été modifié, cette étape est totalement inutile. On peut l&#8217;éviter en mémorisant l&#8217;opcode grâce à un <strong>cache d&#8217;opcode</strong>&#8230;<br />
Attention, il ne faut pas confondre les caches d&#8217;opcode et les caches HTML: un cache HTML servira à envoyer directement la sortie d&#8217;un script au client, sans traitement. Le cache d&#8217;opcode, lui, laisse place à l&#8217;exécution proprement dite du script dans des conditions normales: les données provenant d&#8217;une <a href="http://www.php-experts.org/category/bases-de-donnees/mysql">base de données MySQL</a>, par exemple, seront rapatriées comme à l&#8217;accoutumée. On ne perd donc aucune réactivité au niveau de l&#8217;application, tout en améliorant ses temps de réponse.</p>
<h2>APC ? (Alternative Php Cache)</h2>
<p>Oui, APC. APC est un projet libre, implémenté comme une extension Zend. Cela permet de le compiler dans PHP ou de l&#8217;intégrer plus tard, comme un module classique. Le principal avantage d&#8217;APC (et des autres caches d&#8217;opcode) est qu&#8217;il n&#8217;y a aucun besoin en terme de modification des scripts: il suffit d&#8217;installer et d&#8217;activer le module pour que celui-ci accélère vos scripts PHP. De ce côté là, donc, rien de spécial à ajouter.<br />
APC permet, par un script d&#8217;administration, de suivre quels opcodes sont mis en cache, le nombre de hits économisés, ainsi que les données utilisateur. Très pratique, la colonne &#8220;miss&#8221; vous indique combien de scripts ont été appelés sans profiter de l&#8217;accélération d&#8217;APC (Cela peut arriver car vous pouvez mettre des filtres en place pour ne stocker que certains répertoires, ou limiter la taille en mémoire occupée par l&#8217;ensemble des scripts &#8220;compilés&#8221;, par exemple&#8230;)</p>
<h2>Le cache de données utilisateur</h2>
<p>Mais là où réside, selon moi, la vraie puissance d&#8217;APC, est dans son cache de données utilisateur. En effet, imaginons le cas où nous avons une requête SQL assez lourde, suivie d&#8217;un traitement assez conséquent: sur la page d&#8217;accueil d&#8217;un <a href="http://www.forumfr.com/">forum</a> (lien-copinage), on souhaite afficher les derniers connectés et le nombre de messages qu&#8217;ils ont posté. En théorie, à chaque affichage de la page, on va réexécuter la requête, et donc assassiner bêtement le serveur SQL.<br />
On pourrait stocker les données dans une Session PHP ? Oui, mais d&#8217;une, les sessions ne sont pas faites pour ça, et de deux, on exécuterait quand même la requête SQL et le traitement associé pour chaque nouveau connecté.<br />
La meilleure solution reste alors d&#8217;utiliser le cache de données d&#8217;APC. On va pour cela se servir de la fonction apc_store, qui prend 3 paramètres :<br />
bool apc_store  ( string $key  , mixed $var  [, int $ttl  ] )</p>
<ul>
<li><em>$key</em> est le nom que l&#8217;on souhaite donner à la variable dans le &#8220;magasin&#8221; (store) d&#8217;APC. Je vous conseille de la préfixer du nom du site concerné si vous hébergez plusieurs sites sur le même serveur ; les variables sont accessibles à tous les scripts (attention donc à ce que vous faites dans le cas d&#8217;un hébergement partagé&#8230; ne stockez de préférence aucune donnée &#8220;sensible&#8221; à moins de savoir précisément ce que vous faites).</li>
<li><em>$var</em> est la valeur à stocker, qui peut être un nombre, une chaîne, un tableau, ou même un objet complet (Attention, dans ce dernier cas, à bien inclure la déclaration de classe de l&#8217;objet avant d&#8217;essayer de le récupérer&#8230;).</li>
<li><em>$ttl</em> est le &#8220;Time To Live&#8221; de la variable, c&#8217;est à dire le temps en secondes avant qu&#8217;APC ne l&#8217;efface de son store.</li>
</ul>
<p>Par exemple, dans le cadre de notre forum, on aurait quelque chose comme :</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">apc_store<span class="br0">&#40;</span><span class="st0">&#8216;forum_derniers_connectes&#8217;</span>,<span class="re0">$derniersConnectes</span>,<span class="nu0">60</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Ce qui signifie qu&#8217;on stocke, tel quel, le tableau (array) $dernierConnectes, sous le nom forum_derniers_connectes, pour une durée de 60 secondes.</p>
<p>Pour accéder à la variable, on dispose de la fonction apc_fetch, qui prend le $key de la variable en paramètre, et renvoie soit la valeur stockée, soit FALSE en cas d&#8217;échec. On peut donc faire :</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="re0">$derniersConnectes</span> = apc_fetch<span class="br0">&#40;</span><span class="st0">&#8216;forum_derniers_connectes&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// forum_derniers_connectes n&#8217;est pas présent dans le cache: il faut le calculer</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$derniersConnectes</span> = get_derniers_connectes<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// boum, on exécute</span></div>
</li>
<li class="li1">
<div class="de1">apc_store<span class="br0">&#40;</span><span class="st0">&#8216;forum_derniers_connectes&#8217;</span>,<span class="re0">$derniersConnectes</span>,<span class="nu0">60</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>C&#8217;est tout ! Si APC trouve la variable, il renseigne $derniersConnectes. Dans le cas contraire, on rapatrie les infos et on les stocke pour 60 secondes. La requête-de-la-mort ne sera plus exécutée qu&#8217;une fois par minute.</p>
<h2>Bénéfices</h2>
<p>Le bénéfice est donc double: on économise à la fois sur le temps d&#8217;exécution des scripts en ne les compilant qu&#8217;au besoin grâce au <strong>cache d&#8217;opcode</strong> (d&#8217;environ 50% selon les auteurs, sachant que cela dépendra de la complexité du script&#8230; on gagnera beaucoup plus sur des algorithmes récursifs, notamment), mais aussi sur le temps de processing de certaines ressources grâce au <strong>cache de données</strong>, qui est utilisé ici pour des requêtes SQL mais qui pourrait aussi bien l&#8217;être pour la lecture du fichier de configuration de votre application, par exemple (en stockant, au choix, un tableau associatif ou un objet $config), ou de n&#8217;importe quelle variable qui n&#8217;a pas vraiment besoin d&#8217;être mise à jour en temps réel.</p>
<h2>Liens utiles</h2>
<p><a href="http://fr.php.net/apc">Manuel APC sur php.net</a> (en français)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php-experts.org/developpement-web/php-developpement-web/cache-dopcode-alternative-php-cache-apc-62/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
