<?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>Communauté Magento francophone &#187; Php/Zend/Magento</title>
	<atom:link href="http://www.wikigento.com/category/phpzendmagento/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wikigento.com</link>
	<description>Optimisation de sites E-commerce, hébergment Magento</description>
	<lastBuildDate>Mon, 30 Jan 2012 16:33:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Javascript &amp; PHP, deux goulots d&#8217;étranglement du Web ?</title>
		<link>http://www.wikigento.com/optimisation-lampzendmagento/javascript-php-performances/</link>
		<comments>http://www.wikigento.com/optimisation-lampzendmagento/javascript-php-performances/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 12:52:45 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Optimisation LAMP/Zend/Magento]]></category>
		<category><![CDATA[Php/Zend/Magento]]></category>
		<category><![CDATA[compilation php]]></category>
		<category><![CDATA[interprétation php]]></category>
		<category><![CDATA[langage interprété]]></category>
		<category><![CDATA[performance Javascript]]></category>
		<category><![CDATA[performance magento]]></category>
		<category><![CDATA[performance php]]></category>
		<category><![CDATA[performance zend]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=1372</guid>
		<description><![CDATA[Cet article parle des performances de Javacsript et de celles de PHP, qui sont au coeur du Web moderne mais en fait pas forcément optimisés.]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: justify;"><strong>Javascript et PHP sont-ils des sources de ralentissements ?</strong></h1>
<p><BR></p>
<p style="text-align: justify;">Je vais me faire des amis avec un titre comme celui-là <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Maintenant, au-delà de la provoque, menons une analyse objective.</p>
<p style="text-align: justify;">Nous avons, de nos jours, (au moins) deux gros goulots d’étranglement lorsque nous nous adressons à un site Web :</p>
<ul style="text-align: justify;">
<li>Javascript du coté du client</li>
<li>PHP du coté du serveur.</li>
</ul>
<p style="text-align: justify;">Analyse…</p>
<h2 style="text-align: justify;"><strong>Parlons de Javascript&#8230;</strong></h2>
<p style="text-align: justify;">En général, je m&#8217;intéresse plus aux performances des serveurs que des clients au sens &laquo;&nbsp;navigateurs&nbsp;&raquo;. En réalité, la performance des clients est en générale très liée à celle des serveurs pour être plus précis. Mais le serveur ne peux pas toujours tout.</p>
<p style="text-align: justify;">Notamment les browsers encaissent plus ou moins bien le Javascript et surtout beaucoup de Javascript.</p>
<p style="text-align: justify;">Opera, Chrome, Firefox, Internet Explorer et leurs copains ont une tendance très nette à réagir différemment (je n&#8217;apprends rien aux développeurs Web) et surtout à réagir plus ou moins bien et plus ou moins vite en interprétation de Javascript. De plus, ces différences se cumulent avec des comportements très différents d&#8217;un browser à l&#8217;autre, notamment le nombre de requêtes concurrentes (nombres d&#8217;éléments de la page chargé en parallèle).</p>
<p style="text-align: justify;">Tous les sites récents utilisent énormément de Javascript et ont donc une belle tendance à charger la mule, surtout quand on a plusieurs onglets d&#8217;ouverts sur plusieurs sites, on a tout de suite des machine virtuelle javascript au sein des navigateurs qui se mettent à grossir.</p>
<p style="text-align: justify;">Ok, so what ? Qu&#8217;est ce que j&#8217;y peux me réponde les développeurs&#8230;</p>
<p style="text-align: justify;">Eh bien beaucoup de choses en fait. Déjà, un framework c&#8217;est bien mais ca n&#8217;empêche pas de réfléchir. Faire confiance aveuglément sans regarder le dessous des cartes, c&#8217;est ce qui mène au gâchis de ressources.</p>
<p style="text-align: justify;">Optimiser ces points (comme d&#8217;autres), c&#8217;est ce que j&#8217;appelle la &laquo;&nbsp;culture atari / amiga&nbsp;&raquo;.  En gros, à l&#8217;époque, les développeurs avaient des machines identiques, des machines avec des limites et on pensait à tirer le meilleur partie du Hardware, on optimisait son programme à la goutte prêt, on passait au plus proche du matériel pour faire des choses que les concepteurs de ces machines n&#8217;avaient même pas imaginé.</p>
<p style="text-align: justify;">De nos jours, on prend un framework, on instancie un objet et hop, derrière ca pédale mais c&#8217;est plus mon problème&#8230; Revenons à Javascript.</p>
<h2 style="text-align: justify;"><strong>Des soucis de tableaux !</strong></h2>
<p style="text-align: justify;">Il y a de nombreuses sources de maux dans Javascript, langage qui devient incontournable sur le Web depuis 5 ans. Mais lorsque les sites traitent de sujets plus complexes ou offres de nouveaux raffinement, ce qui était &laquo;&nbsp;une brique parmi d&#8217;autres&nbsp;&raquo; devient plus sensible.</p>
<p style="text-align: justify;">Commençons par un soucis simple de Javascript : les tableaux.</p>
<p style="text-align: justify;">Allouer un tableau en JS déclenche des mécanismes très différents d’un malloc en C. Allons y ! Sous IE, la logique de traitement est la suivante :</p>
<p style="text-align: justify;">var my_array = new Array();</p>
<p style="text-align: justify;">for (i = 0; i &lt; 100000; i ++)</p>
<p style="text-align: justify;">my_array[i] = i;</p>
<p style="text-align: justify;">1°) Je crée un objet array qui est une table de hashage.</p>
<p style="text-align: justify;">2°) Comme une table de hashage est un objet générique, je lui crée un attribue length (taille) et on le met à 0</p>
<p style="text-align: justify;">3°) La boucle fait, pour chaque valeur de i</p>
<ul style="text-align: justify;">
<li>Une conversion de i en string (chaine de caractère, en gros i= « i »)</li>
<li>Ajoute un clef de hash pour chaque couple « chaine i », i</li>
<li>Réajuste la valeur de length</li>
</ul>
<p style="text-align: justify;">OMG. Donc, rien que pour assigner une valeur au tableau, on a fait 3 opérations (dont deux totalement inutile si on a codé un jour en C).</p>
<p style="text-align: justify;">Pour compléter le tableau, les allocations réelles de mémoire ne sont pas continues car les tableaux sont gérés sous la forme de « sparse » array.</p>
<p style="text-align: justify;">C’est avantageux en terme d’usage réel de la RAM car les blocks vides ne sont pas alloués, par contre les allocations ne sont pas contigüe. Du coup, les accès à ces blocks de données ne se font pas à la suite et n’utilise pas certains mécanismes de prédiction des processeurs ou certains caches des OS. De plus les entrées du tableau ne sont pas indexées.</p>
<p style="text-align: justify;">Bon, maintenant, on a tout pour faire une usine à gaz de compétition !</p>
<p style="text-align: justify;">Pour résoudre ce premier point, sous IE 8, le « sparse array » est détecté comme étant dense ou non. En gros il est très peuplé ou non. Pour que l’heuristique de IE8 comprenne que c’est un « dense sparse array », il faut que ce tableau soit d’une taille explicite (en théorie mais un autre blog ne dénote pas de différence de perfs sur ce point) par contre, il faut en initialiser tous les éléments. Le défaut c’est que toute la RAM est allouée et le coté « sparse » disparait.</p>
<p style="text-align: justify;">Sur un gros PC ce n’est pas si dramatique mais sur un téléphone portable, ouch… Du coup, initialiser l’ensemble du tableau n’est pas toujours la bonne option. Un comportement optimal serait de détecter le navigateur et de lui proposer un Javascript optimisé pour le ratio Rapidité, consommation de CPU &amp; RAM, logique de traitement. Une sorte de librairie optimisée de gestion des tableaux, dépendante de la plateforme qui l’exécute.</p>
<p style="text-align: justify;">En termes d’impacts c’est non négligeable !</p>
<p style="text-align: justify;">Quelques très bon liens pour ceux que ca intéresse. Le premier blog a d’ailleurs de très bons papiers d’une manière générale !</p>
<p style="text-align: justify;"><a href="http://www.outofwhatbox.com/blog/2009/11/javascript-array-performance-initialize-to-optimize/">http://www.outofwhatbox.com/blog/2009/11/javascript-array-performance-initialize-to-optimize/</a></p>
<p style="text-align: justify;"><a href="http://www.outofwhatbox.com/blog/2009/12/javascript-array-performance-and-why-it-matters/">http://www.outofwhatbox.com/blog/2009/12/javascript-array-performance-and-why-it-matters/</a></p>
<p style="text-align: justify;"><a href="http://blogs.msdn.com/jscript/archive/2008/03/25/performance-optimization-of-arrays-part-i.aspx">http://blogs.msdn.com/jscript/archive/2008/03/25/performance-optimization-of-arrays-part-i.aspx</a></p>
<p style="text-align: justify;">
<h1 style="text-align: justify;"><strong>PHP et les performances : plantons le décor</strong></h1>
<p><BR></p>
<p style="text-align: justify;">Revenons à nos serveurs ! Dans une infrastructure Magento, ce qui pompe dur au niveau des performances, c’est PHP et de très loin.</p>
<p style="text-align: justify;">Il faut évidemment de la RAM pour accélérer les accès et traiter les données mais les appels PHP coutent très chers. Et c’est bien logique car le Web est coincé dans un incroyable paradoxe.</p>
<p style="text-align: justify;">Les langages interprétés (comme PHP) sont très adaptés à certains traitements mais d’une manière générale, pour tous les traitements répétitifs ou massifs, on les évite.</p>
<p style="text-align: justify;">L’idée c’est que dans la rapidité des langages, l’échelle est très claire :</p>
<h3 style="text-align: justify;"><span style="text-decoration: underline;">Les compilés :</span></h3>
<p style="text-align: justify;">Les langages ASM/C et C++ sont compilés et (donc) très rapides. On décrit le code et cela se transforme en Opcode directement interprétables et optimisables par le processeur. Tous les caches deviennent super efficaces (L1/L2/L3 du processeur notamment) et le programme traite les données au fil de l’eau et au fil du temps. Le programme se charge en mémoire, il ne s’arrête que quand on lui demande et peut sommeiller le temps d’attendre son prochain traitement.</p>
<p style="text-align: justify;">Assembleur : niveau processeur directement, très peu voir pas d’interprétation, vitesse maximale.</p>
<p style="text-align: justify;">C : Le code produit par un compilateur C est très proche de l’assembleur et donc extrêmement rapide. Pour autant cela reste un langage relativement évolué, contrairement à l’assembleur on a pas à tout écrire de zéro, des librairies existent, des includes, du code un peu évolué d’une manière générale.</p>
<p style="text-align: justify;">C++ : Un langage C évolué et Objet. On monte encore un peu dans les couches, on fait de l’objet et du fonctionnel, on en est plus à la douce barbarie redoutablement efficace de l’assembleur mais ca reste un code qui, une fois compilé, est redoutablement efficace.</p>
<p style="text-align: justify;">Très peu souples en typage ou en gestion de la mémoire, ces trois langages compilés, pour ne citer qu’eux, sont extrêmement rapides !</p>
<h3 style="text-align: justify;"><span style="text-decoration: underline;">La machines virtuelles :</span></h3>
<p style="text-align: justify;">Ce sont des programmes qui crée un environnement permettant d’exécuter d’autres programmes en leur sein. L’intérêt essentiel est de s’affranchir de la couche en dessous, en gros le programme devient portable partout. Si la VM existe pour l’environnement matériel cible, le programme tournera (presque) à l’identique sans rien redévelopper. L’inconvénient, comme toute forme de virtualisation, c’est que la VM consomme de la ressource pour créer cette couche d’abstraction, bilan ces langages ne sont pas toujours des foudres de guerre.</p>
<p style="text-align: justify;">Java et autres JVM</p>
<p style="text-align: justify;">Java est le plus connu des langages tournant dans une machine virtuelle, la JVM. C’est un bon langage, objet, évolué et indépendant du matériel mais il souffre de devoir être compilé tout en étant pas aussi rapide qu’un autre langage compilé.</p>
<p style="text-align: justify;">Les « interprétés » :</p>
<p style="text-align: justify;">Aïe. Perl, PHP et de nombreux copains à eux sont des langages dits « interprétés ». A chaque fois qu’il est lancé, le programme (test.php par exemple) est lu par un interpréteur externe (php par exemple), le fichier est parcouru, compilé à la volée quelque part, mais une fois finit, on repart de zéro. Le fichier programme à interpréter est donc lu à chaque fois et le programme qui le lit, l’interpréteur, est un programme qui est lui chargé à chaque exécution aussi.</p>
<p style="text-align: justify;">PHP :</p>
<p style="text-align: justify;">Un des plus célèbres. Zend au dessus est en fait composé de PHP objet évolué au sein d’un Framework, encore une couche d’abstraction. Donc si l’on compare avec nos précédents amis, Zend c’est le C++, Php le C sauf que tout cela est lu/chargé/parsé/interprété puis exécuté en continu. C’est un peu comme si on avait à se taper la compilation a chaque fois qu’on lance le programme… En fait l’image est très exacte puisque c’est quasiment exactement ce qui se passe. Bilan, les langages interprété c’est pratique, facile à maintenir et programmer, on s’affranchit de tous les aspects un peu rigoureux d’allocation mémoire ou de gestion des taches de bases mais le coût en terme de performances est énorme.</p>
<p style="text-align: justify;">PS : Javascript est un langage de scripting interprété tournant dans une machine virtuelle (navigateur)… Tout pour gagner J</p>
<h1 style="text-align: justify;"><strong>Vers un PHP compilé ?</strong></h1>
<p><BR></p>
<p style="text-align: justify;">Comme signalé plus haut, l’interprété c’est consommateur et pas adapté aux traitements récurrents. Maintenant si l’on considère une architecture d’hébergement Web, que se passe-t-il.</p>
<p style="text-align: justify;">Admettons que le site soit en Magento, on a un framework de deuxième niveau, qui repose sur un framework de premier niveau (Zend) qui repose sur un langage interprété objet (PHP5) qui repose sur un interpréteur (Php) qui lui-même est compilé et s’adresse en assembleur au processeur.</p>
<p style="text-align: justify;">Ajoutez un peu de virtualisation là-dessus et avant qu’une requête ne passe à travers tout ce maillage, vous avez perdu une quantité de puissance tout proprement hallucinante !</p>
<p style="text-align: justify;">En soit, aucun reproche au fait d’utiliser PHP ou sa syntaxe, par contre, soyons clairs l’approche est juste complètement aberrante. En fait si on essayait de faire pire, le seul moyen, ca serait de faire tourner l’interpréteur php dans une JVM…</p>
<p style="text-align: justify;">Et oui, ce n’est pas anodin mais bien dramatique. A chaque fichier PHP que vous chargez, l’interpréteur est lancé. A chaque fichier php de chargez, vous provoquez toute la cascade de compilation, d’accès disque, d’exécution. Quand un visiteur passe, il provoque donc des centaines de lancement du programme PHP qui va interpréter autant de fichiers… C’est une boucherie, une hémorragie de puissance pour finalement un problème très bête.</p>
<p style="text-align: justify;">Le problème ce n’est pas Magento, Zend ou les fichiers PHP en soit. Sortons de la barbarie de l’assembleur, vive l’objet et tout et tout, on développe plus vite, on réutilise du code, on capitalise des librairies ! C’est l’avancement logique, l’avenir, donc ca va continuer à se développer. Par contre, pourquoi on ne compile pas tout cela ?</p>
<p style="text-align: justify;">La charge CPU des serveurs serait juste divisée par un facteur 10 à vue de nez… C’est à ce point négligeable ? Plus clairement, sur un serveur, au lieu d’accueillir 20 000 personnes par jours par exemple, on en accueillerait 200 000. Avec le même serveur. L’approximation est un peu grossière mais pas outrancière non plus.</p>
<p style="text-align: justify;">Le Web, qui par essence provoque des milliers de lecture et interprétation de fichier de programme, utilise un système d’interprétation, ce qui est la pire façon de faire, ce qui est le plus consommateur possible. Voici le paradoxe.</p>
<p style="text-align: justify;">Si je me la faisais à la Yann Arthus-Bertrand, je redirais « alors pourquoi toi, homo sapiens sapiens, ne compile tu pas tes langages Web ?». Es-tu conscient des ressources gâchées par cette hérésie et de l’impact, de l’empreinte carbone, de cette approche incompréhensible ? Tu veux vraiment défoncer les puits de soleil ? Tu es un inconscient pathologique, un criminel notoire, un serial-gâcheur ? Ooops, je m’emporte&#8230; Yann (dont j’aime beaucoup le travail mais un peu moins la voix monocorde) n’irait pas jusque là !</p>
<p style="text-align: justify;">« Pourquoi ne compile t’on pas ? », bon ok, j’arrête de faire mon YAB…</p>
<p style="text-align: justify;">Je n’ai rien contre les développeurs, qui n’y peuvent pas grand-chose si ce n’est optimiser leur code (ca serait déjà un bon début pour certain ceci étant). Ce qui me froisse par contre, c’est que l’on a pas encore de solutions parfaitement mûres pour corriger ce point.</p>
<p style="text-align: justify;">Des soucis assez complexes de conception sont au rendez-vous pour passer du PHP de l’état interprétable à l’état compilé. Mais ne vous y trompez pas, le Graal est au bout de la route.</p>
<p style="text-align: justify;">Plusieurs initiatives sont en cour de développement par des gens talentueux que je ne peux qu’encourager dans cette voie : Roadsend et PHC (Php compiler mais qui paraît à l’arrêt) semblent être les leaders dans cette voie.</p>
<p style="text-align: justify;"><a href="http://www.phpcompiler.org/">http://www.phpcompiler.org/</a></p>
<p style="text-align: justify;"><a href="http://www.roadsend.com/home/index.php?pageID=compiler">http://www.roadsend.com/home/index.php?pageID=compiler</a></p>
<p style="text-align: justify;">L’autre approche possible serait un cache plus efficace, pas uniquement des opcodes comme APC mais bien des pages rendues, du résultat de l’interprétation PHP. C’est ce vers quoi se dirige Zend Server, c’est une bonne première transition mais le compilateur serait bien LA solution !</p>
<p style="text-align: justify;">
<h1><strong>En conclusion</strong></h1>
<p><BR></p>
<p style="text-align: justify;">Je dirais que PHP et surtout le modèle interprété qui va avec et Javascript et surtout l’implémentation qui en ait faite des les navigateurs autant que dans le code de certaines pages Web, sont deux problèmes.</p>
<p style="text-align: justify;">Ces deux axes de progression nous apporteraient un Web plus rapide, souple et agréable d’utilisation. Le réseau n’est plus réellement une limite, les processeurs sont suffisamment puissants alors deux cas sont possibles :</p>
<p style="text-align: justify;">-      Quelques personnes douées arrivent au bout de ces deux problèmes</p>
<p style="text-align: justify;">
<p style="text-align: justify;">-      Tout le monde se contente de ce qu’on a, on enterre la logique d’optimisation de l’époque atari &amp; amiga, on tue les phoques et la banquise en consommant inutilement des ressources informatiques précieuses. On compense par plus de puissance, plus de ressources consommées, plutôt que de mieux utiliser.</p>
<p style="text-align: justify;">
<p style="text-align: justify;">Un classique me direz-vous ?</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/optimisation-lampzendmagento/javascript-php-performances/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Magento Academy : Quelques nouvelles</title>
		<link>http://www.wikigento.com/phpzendmagento/magento-academy-quelques-nouvelles/</link>
		<comments>http://www.wikigento.com/phpzendmagento/magento-academy-quelques-nouvelles/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 21:02:51 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Magento Academy]]></category>
		<category><![CDATA[Php/Zend/Magento]]></category>
		<category><![CDATA[académie magento]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=1162</guid>
		<description><![CDATA[Description des services de la Magento Academy]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><a title="Magento Academy" href="http://www.magento-academy.com" target="_blank"><img class="size-full wp-image-1165 aligncenter" title="Magento Academy" src="http://www.wikigento.com/wp-content/uploads/2009/10/magentoAcademy.jpg" alt="Logo Magento Academy" width="363" height="120" /></a> </span></span></p>
<p><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Nous y voici, une école exclusivement dédiée à Magento va voir le jour.<br />
Wikigento va répondre à quelques unes de vos questions en exclusivité !</span></span></p>
<h1><span style="font-size: x-large;"><strong><span style="font-family: arial,helvetica,sans-serif;">Pourquoi une Magento Academy ?</span></strong></span></h1>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">En premier lieu, la technologie Magento est une indéniable réussite et la demande pour la solution ne cesse d&#8217;augmenter.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Les besoins accompagnant une telle expansion sont nombreux et les Web Agencies ont besoin d&#8217;un personnel compétent et qualifié pour développer des sites toujours plus nombreux.<br />
</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Plus de sites à créer sur Magento, parce que la technologie prend des parts de marché mais aussi parce que le E-commerce d&#8217;une manière générale se développe. Plus de sites, donc un plus grand besoin  de développeurs.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Il est probable que ce soit une première car très peu de technologies bénéficient d&#8217;une école spécifique.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Le besoin d&#8217;une école s&#8217;explique également par le fait que les développeurs sont de niveaux et d&#8217;expériences hétérogènes. Certains maitrisent php4 mais pas encore la POO (programmation Orientée Objet), d&#8217;autres déjà Zend et certains enfin ont une expérience significative avec Magento. La chaîne des connaissances nécessaires est très importante et complexe, la qualité des sites qui sortent des mains des développeurs est de fait très différente selon leurs connaissances. La Magento Academy a donc pour vocation de faire un &laquo;&nbsp;nivellement par le haut&nbsp;&raquo;.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">L&#8217;Academy sera un Organisme de Formation officiellement agréé ce qui permettra aux entreprises de faire prendre en charge partiellement ou totalement les frais de formations et aux salariés d&#8217;exercer leurs D.I.F (droit individuel à la formation).</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">L&#8217;Academy formera aussi les utilisateurs qui administrent le backoffice de Magento et les designers de templates (les intégrateurs graphiques).</span></span></p>
<h1><span style="font-size: x-large;"><strong><span style="font-family: arial,helvetica,sans-serif;">Quelle légitimité pour l&#8217;Academy et pour ses stagiaires ?</span></strong></span></h1>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">L&#8217;Academy est fondée par des experts Magento fortement investis dans la Communauté Francophone de Magento et elle est supportée officiellement par Varien qui en fait son centre officiel et international de formation et de certification.  Le parrain de l&#8217;Academy n&#8217;est autre que Yoav Kutner, Directeur technique de Varien et co-créateur de Magento.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Les cursus de formation et les méthodes de certifications sont élaborés conjointement par les experts de l&#8217;Academy et par Varien. Les certifications seront même signées par Yoav Kutner en sa qualité de Directeur des Certifications !</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Grâce à cette méthodologie de travail rigoureuse, les formations enseignées seront ce qui se fait de plus pointu en la matière et l&#8217;éditeur lui même fait de l&#8217;Academy sont fer de lance en matière de formation et de certification.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Cette première Française est amenée à se développer en Europe et à l&#8217;international notamment par le biais du E-learning.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Les niveaux de certifications qui seront obtenus par les stagiaires qui les passeront seront officiellement reconnus par l&#8217;éditeur, par l&#8217;Academy et plus généralement par la communauté. De facto le monde professionnel apprendra rapidement la valeur de ces niveaux de certifications et pourra aussi en tenir compte pour ses besoins en recrutement ou composition d&#8217;équipe.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">3 niveaux de certification sont conçus spécifiquement pour le développement : Développeur Magento Certifié (DMC), Spécialiste Magento Certifié (SMC) et le plus haut niveau : Expert Magento Certifié (EMC). <em>(Le niveau d&#8217;expert ne pourra être atteint qu&#8217;après avoir démontré une expérience significative en plus de réussir la certification, en deux temps donc)</em></span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">2 autres certifications techniques seront délivrées par l&#8217;Academy en dehors des certifications développeurs : Intégrateur &amp;  Chef de projet.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"> </span></span></p>
<p style="text-align: justify;"><span style="font-size: x-large;"><strong><span style="font-family: arial,helvetica,sans-serif;">Quel sont les liens entre l&#8217;Academy &amp; Varien ?</span></strong></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">L&#8217;Academy est un partenaire Varien, soutenu par l&#8217;éditeur. L&#8217;affiliation précise dans le programme de partenariat Varien sera probablement &laquo;&nbsp;Industry Partner&nbsp;&raquo;.<br />
</span></span><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><br />
Il est malgré tout important de préciser que même si l&#8217;Academy travaille main dans la main avec Varien (notamment pour les supports et certifications) , Varien n&#8217;est en aucun cas actionnaire de l&#8217;academy qui est une société indépendante. &laquo;&nbsp;Third Party Company&#8217; comme les américains le disent si bien.<br />
</span></span><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><br />
La Magento Academy n&#8217;est donc ni possédée ni dirigée par Varien, c&#8217;est une relation de partenariat fort.<br />
</span></span><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><br />
Varien tiens à ce que les partenaires existants ne se sentent pas en danger vis à vis de l&#8217;academy, il est donc important de signaler que l&#8217;academy est un organisme de formation et en aucun cas une Webagency ou une société d&#8217;hébergement ou tout autre métier lié à Magento. L&#8217;academy ne sera donc en aucun cas concurrente  des sociétés envoyant leur personnel se former.<br />
</span></span><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><br />
Evidemment, tout le monde pourra se faire former sans distinction du moment que les compétences pré requises minimum sont présentes en fonction de la formation demandée. De la même façon les certifications seront les mêmes pour tous, que ce soit en reconnaissance ou au niveau de l&#8217;examen, le but de l&#8217;academy est de former et/ou de certifier des professionnels pour aider au bon usage et au bon développement de la technologie Magento.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"> </span></span><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"> </span></span></p>
<h1><span style="font-size: x-large;"><strong><span style="font-family: arial,helvetica,sans-serif;">Devra-t-on obligatoirement passer par l&#8217;Academy pour être certifié ?</span></strong></span></h1>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">L&#8217;Academy est le seul centre officiel de formation à la technologie Magento mais d&#8217;autres organismes existent. De même, une personne peut apprendre intégralement par ses propres moyens la technologie et certains développeurs disposent déjà des connaissances nécessaires au passage de la certification.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Dans ces cas, les prétendants à la certification pourront passer l&#8217;examen en candidat libre sans être au préalable passés par l&#8217;Academy, avec les mêmes chances que tout le monde de réussir les examens.</span></span></p>
<h1><span style="font-size: x-large;"><strong><span style="font-family: arial,helvetica,sans-serif;">Quand l&#8217;Academy sera-t-elle opérationnelle ?</span></strong></span></h1>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">L&#8217;inauguration de l&#8217;Academy par son parrain Yoav Kutner aura lieu le 9 novembre 2009 à l&#8217;espace Saint Martin lors de Bargento 3. Cette inauguration marquera l&#8217;ouverture des premières promotions et les premières certifications auront lieu lors du mois de décembre 2009 ou de Janvier 2010.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">L&#8217;activité de formation à proprement parler commencera mi novembre.<br />
</span></span></p>
<h1><span style="font-size: x-large;"><strong><span style="font-family: arial,helvetica,sans-serif;">Quels cours seront dispensés, quels cursus seront disponibles ?</span></strong></span></h1>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><span style="text-decoration: underline;">Trois cursus sont prévus pour le moment pour les développeurs : un court, un long et un complet : </span></span></span></p>
<ul>
<li style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Le cursus développeur court (4/5 jours) est conçu pour les développeurs maitrisant déjà PHP5, la POO et ayant quelques notions en Zend framework. Ce sont des développeurs Web expérimentés qui souhaitent se spécialiser sur Magento. 4 jours de cours seront complétés d&#8217;un jour optionnel de spécialisation.</span></span></li>
<li style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Le cursus développeur long (~10 j) est destiné à ceux qui veulent explorer les moindres recoins de la technologie. Ils partent avec à peu près les mêmes connaissances que les stagiaires des cursus cours et souhaitent aborder chaque point en profondeur.</span></span></li>
<li style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Le cursus complet est fait pour les développeurs &laquo;&nbsp;Lamp&nbsp;&raquo; qui n&#8217;ont pas encore fait le virage PHP Objet. Il comprend une formation PHP5 et POO, une formation aux outils et au framework Zend et une formation Magento. Ce cursus est fait pour ceux qui ont des connaissances en PHP/Mysql et qui souhaitent faire le grand saut vers Magento.</span></span></li>
</ul>
<p><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Ceux qui le souhaitent pourront également recevoir un complément de formation relatif à l&#8217;amélioration des performances, l&#8217;optimisation et l&#8217;administration système spécifiquement pour Magento.</span></span></p>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><span style="text-decoration: underline;">Pour les profils qui ne sont pas spécialisés dans le développement, trois cursus sont également prévus :</span></span></span></p>
<ul style="text-align: justify;">
<li><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Administrateur Magento : Afin d&#8217;être totalement autonome avec son nouveau site, une entreprise doit pouvoir maintenir son catalogue, faire le point sur ses ventes ou intervenir sur des points spécifiques. Pour répondre à ces besoins, une formation utilisateur du Backoffice est prévue afin que les utilisateurs finaux puissent cliquer sur les différents boutons de l&#8217;interface sans craindre l&#8217;armaggédon en permanence <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></span></li>
<li><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Intégrateur Magento : Intégrer un template sous Magento demande une maîtrise du système de template. Sans devoir forcément maîtriser l&#8217;ensemble de la chaîne de développement, l&#8217;intégrateur ne peut se contenter de découpage. Aussi, cette formation permet d&#8217;acquérir toutes les connaissances nécessaires aux intégrateurs pour leur permettre les meilleurs intégrations graphiques possibles sur Magento.</span></span></li>
<li style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">Chef de projet Magento : Comment manager un projet Magento sans connaitre le Framework ? Comment dire à son client si oui ou non ceci ou cela est possible et combien de temps sera alloué à cette tache ? C&#8217;est le rôle du chef de projet d&#8217;être à la fois conscient des implications techniques et en même temps de se consacrer au fonctionnel qui préoccupe le client. Cette formation s&#8217;adresse donc aux chefs de projets Magento.</span></span></li>
</ul>
<p style="text-align: justify;"><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;"><br />
Une formule &laquo;&nbsp;packagée&nbsp;&raquo; de formation à l&#8217;usage du backoffice sera mis à disposition des Web agency souhaitant intéger un cursus de formation utilisateur à leurs offres de développement.<br />
</span></span></p>
<p><span style="font-size: small;"><span style="font-family: arial,helvetica,sans-serif;">D&#8217;autres questions ?<br />
Posez les directement à <a href="mailto:contact@magento-academy.com" target="_blank">contact@magento-academy.com</a> !</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/phpzendmagento/magento-academy-quelques-nouvelles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento &amp; Zend server : the benchmarks !</title>
		<link>http://www.wikigento.com/test-bench/magento-zend-server-the-benchmarks/</link>
		<comments>http://www.wikigento.com/test-bench/magento-zend-server-the-benchmarks/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 15:10:51 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Optimisation LAMP/Zend/Magento]]></category>
		<category><![CDATA[Php/Zend/Magento]]></category>
		<category><![CDATA[Test / Bench]]></category>
		<category><![CDATA[Magento and Zend server performances benchmark]]></category>
		<category><![CDATA[Magento Zend server]]></category>
		<category><![CDATA[Zend and Magento]]></category>
		<category><![CDATA[Zend page cache]]></category>
		<category><![CDATA[Zend server benchmark]]></category>
		<category><![CDATA[Zend server performances]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=938</guid>
		<description><![CDATA[Cet article (en anglais) est un benchmark complet des performances comparées des versions 1.2, 1.3 et 1.3 avec flat catalog de Magento. Ensuite Zend server a été ajouté pour améliorer les performances de l'ensemble et des tests ont de nouveau été menées afin de comparer l'ensemble.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Bonjour à toutes et à tous,</p>
<p style="text-align: justify">Ce coup-ci l&#8217;article sera en anglais car c&#8217;est une publication d&#8217;un white paper rédigé à l&#8217;origine par <a title="NBS System hébergement et infogérance Magento" href="http://www.nbs-system.com/hebergement">NBS System</a> sur les performances de Magento quand on y couple Zend server. Les tests &amp; benchmarks sont fait entre les versions 1.2, 1.3 et 1.3 avec le flat catalog d&#8217;activé puis avec Zend Server et enfin avec Zend server incluant le page cache (version payante).</p>
<p style="text-align: justify">Ce white paper est en licence Creative commons paternity no commercial use, vous pouvez donc le télécharger, le modifier, le diffuser à votre convenance, sauf pour usage commercial. Celui-ci est uniquement autorisé aux sociétés NBS System, Zend et Varien. <em>(NBS System peut autoriser explicitement l&#8217;usage commercial de ce contenu sur demande)<br />
</em></pre>
<p>Vous pouvez le télécharger dans sa <a title="Magento and Zend server performances benchmark" href="http://www.wikigento.com/wp-content/uploads/2009/07/magento-and-zend-server-benchmarks-june-2009.pdf" target="_blank">version PDF intégrale ici</a>.</p>
<p><a rel="attachment wp-att-939" href="http://www.wikigento.com/?attachment_id=939"><img class="size-full wp-image-939 alignright" title="cc-logo" src="http://www.wikigento.com/wp-content/uploads/2009/07/cc-logo.jpg" alt="cc-logo" width="115" height="40" /></a></p>
<p align="center"><span style="font-size: large;"><span style="font-family: Verdana, &quot;geneva&quot;;"><strong>Magento &amp; Zend Benchmarks</strong></span></span></p>
<p><span style="font-size: large;"> </span></p>
<p><span style="font-size: large;"><span style="font-family: Verdana, &quot;geneva&quot;;"><strong><span style="font-size: large;"> </span></strong></span></span></p>
<p><span style="font-size: large;"> </span></p>
<p align="center"><span style="font-size: large;"><span style="font-family: Verdana, &quot;geneva&quot;;"><strong><span style="font-size: large;">Version 1.2, 1.3 (with &amp; without Flat Catalogs)</span></strong></span></span></p>
<p align="center"><span style="font-size: large;"><span style="font-family: Verdana, &quot;geneva&quot;;"><strong> </strong></span></span></p>
<p align="center"><span style="font-size: large;"><span style="font-family: Verdana, &quot;geneva&quot;;"><strong> </strong></span></span></p>
<h1>1. Foreword</h1>
<p><BR></p>
<p style="text-align: justify">Magento is a PHP/Zend application which intensively uses the CPU. Since version 1.1.6, each new version includes some mechanisms aimed to improve the performances. The goal is to use fewer resources for a given e-shop, which mainly means less CPU, in order to host more users with the same hardware.</p>
<p style="text-align: justify">One key to achieve better performances is how to optimize PHP pages generation and service. "LAMP" servers are well known and usually run Apache server with mod-php, eventually in fast_cgi mod.</p>
<p style="text-align: justify">Zend, the PHP Company, made a specific server (Zend Server), which includes a web application stack that (among other things) improves application performances through page caching and opcode reorganization &amp; acceleration.</p>
<p style="text-align: justify">Apache and Zend Server is an alternative to the usual Apache and mod-php to run Magento, the goal of theses studies &amp; tests is to qualify and estimate the performances added by the use of this software.</p>
<p style="text-align: justify">Many thanks to Yoav Kutner (Varien's CTO) for providing us with prefilled catalogs for 1.2 and 1.3 version of Magento. Thanks goes as well to Zend labs for providing help in configuration and tweaking of the Zend Server as well as explaining the in depth mechanism of the solution.</p>
<p style="text-align: justify"><span id="more-938"></span></p>
<h1>2. Methods &amp; tools used</h1>
<p><BR></p>
<p style="text-align: justify">The benchmarks were done using siege (2.66-2), with different numbers of simultaneous threads (5, 10, 20 and 40). Each thread opens a connection to the web server, request a page, and start again as soon as the page is fetched.</p>
<p style="text-align: justify">Tests were run over 5 minutes each; average pages retrieved was counted for this benchmark.</p>
<p style="text-align: justify">Two kinds of tests were done: the first one is the simplest; we only load the main page in loop, as fast as possible.</p>
<p style="text-align: justify">The second test is based on logs produced by a visit, loading all the data the browser collected (including css, js, images ...). As loading a single page would usually load multiple elements, the number displayed is much higher than the number of pages that would be actually seen by visitors.</p>
<p style="text-align: justify">(18 pages viewed by the user, for 91 items downloaded, a ratio around 5)</p>
<p style="text-align: justify">All results were obtained on the same hardware and operating system, for testing purposes, no reverse proxy was active during the benchmarks but APC code cache was running. This was a "standard", default environment with no special performance tweaks installed.</p>
<h2>Hardware used</h2>
<p>Dual Quad-Core AMD Opteron(tm) Processor 2376 (2.3GHz), 8GB Ram, 15K SAS disks. (Dell PE M605)</p>
<h2>Software context</h2>
<p>Operating system: Linux (2.6.27.10-grsec) on a Debian (lenny)<br />
Web Server: Apache2 (2.2.9-10+lenny2)<br />
PHP (mod-php): mod-php5 (5.2.6.dfsg.1-1+lenny3) / php-apc (3.0.19-2)<br />
PHP (Zend Server): zend-pe (1.0.0-1+b47) / mod-php5-zend-pe (5.2.9+b75)</p>
<h2>Repositories</h2>
<p>deb http://ftp.fr.debian.org/debian/ lenny main<br />
deb http://security.debian.org/ lenny/updates main<br />
deb http://volatile.debian.org/debian-volatile lenny/volatile main<br />
deb http://repos.zend.com/deb/pe pe non-free</p>
<h1>3. Magento Versions benchmarks</h1>
<p><BR></p>
<p style="text-align: justify">Those tests were realized on an 80 000 (later called 80 k) products catalog.</p>
<p style="text-align: justify">Graphs represent the average number of requests successfully loaded from the server per second during the 5 minutes test.</p>
<h2>Loading the homepage</h2>
<p align="center">
<p style="text-align: center;"><img class="size-medium wp-image-949 aligncenter" title="graph1 - Comparison between 1.2, 1.3 and 1.3 + flat catalog" src="http://www.wikigento.com/wp-content/uploads/2009/07/graph1-500x286.jpg" alt="graph1 - Comparison between 1.2, 1.3 and 1.3 + flat catalog" width="500" height="286" /><br />
Magento 1.3 is much faster than 1.2 showing the main page. Flat Catalogs do not help much displaying this homepage, and seems to even slow down a little under heavy loads. The performance between 1.2 and 1.3 is doubled for low charges and is still 33% higher under heavy load.</p>
<p style="text-align: justify">For a standard value, under a "standard" load, we can consider that +40% is a reasonable value when running a 1.3 version instead of a 1.2, at least for the homepage.<strong> </strong></p>
<h2>Full visit cycle</h2>
<p style="text-align: center" align="center"><a rel="attachment wp-att-950" href="http://www.wikigento.com/?attachment_id=950"><img class="aligncenter size-medium wp-image-950" title="Graph2 - Full visit, comparison between 1.2, 1.3 and 1.3 + FC" src="http://www.wikigento.com/wp-content/uploads/2009/07/graph2-500x286.jpg" alt="Graph2 - Full visit, comparison between 1.2, 1.3 and 1.3 + FC" width="500" height="286" /></a></p>
<p style="text-align: justify">The graph shows a slightly smaller increase with 1.3 compared to 1.2 and the flat catalog mechanism give an overall benefit which greatly increases the performances.</p>
<p>For the records, we can reasonably choose to keep theses values in mind:</p>
<p>Version 1.2 -&gt; 1.3 : +66%<br />
Version 1.3 -&gt; 1.3+Flat Catalog : +20%</p>
<h1>4. Apache + mod-php VS Apache + Zend Server</h1>
<p><BR></p>
<p style="text-align: justify">Zend Server (sometimes refered as ZS later on) comes with several built-in technologies for enhancing application performance:</p>
<ul style="text-align: justify">
<li> Zend Optimizer+ performs byte-code optimization and caching. This speeds up PHP applications by eliminating the process of reading scripts from disk and compiling them. Zend Optimizer+ runs automatically, and installing your application on top of Zend Server (ZS) is all you need to do in order to enjoy its benefits. During the test with ZS, APC Code cache is deactivated as Zend optimizer+ is doing the same job.</li>
<li> Zend Page Cache allows caching of complete PHP pages. Page Caching greatly improves the performance of web applications while maintaining dynamic capabilities through an elaborate system of caching rules that could be based on request parameters and user session data. Page Caching also has the benefit of not requiring any code changes, and can be set up from the Zend Server UI. Only the "pro" version contains this precise piece of software which definitely makes a difference as we will see in a minute.</li>
<li> Zend Data Cache is a set of API functions enabling a developer to store and manage data items (PHP strings, arrays and other data) and even output elements in either disk-based cache or shared memory cache. Zend Data Cache allows for precision-guided caching when Page Caching is not an option. The provided API is easy-to-use on existing code, and in many cases a developer can skip existing code sections by simply wrapping them with caching APIs. This precise piece of software would benefit from a little remastering of the code by Varien to really achieve a full support of this functionality. If done, we can imagine selectively flushing the cache when changing some pages on the servers and not destroying the whole Magento cache thus doing a "cold cache start" after a new functionality is put online.</li>
</ul>
<p style="text-align: justify"><strong><br />
Note: </strong>Zend Optimizer+ and Zend Data Cache are available in the free, community version of Zend Server, while Zend Page Cache requires a licensed Zend Server (full comparison of Zend Server and Zend Server Community Edition is located at <a href="http://www.zend.com/fr/products/server/editions">http://www.zend.com/fr/products/server/editions</a>).</p>
<h2><strong>Zend Server Configuration for Magento</strong></h2>
<p>In the benchmark, two caching rules have been defined:<br />
The first rule caches the JavaScript files which are dynamically merged into one request by Magento.<br />
This simple rule results in a very substantial improvement to response times.</p>
<p align="center"><img class="aligncenter size-medium wp-image-952" title="ZS - configuration screen shot 1" src="http://www.wikigento.com/wp-content/uploads/2009/07/sc11-500x327.jpg" alt="ZS - configuration screen shot 1" width="500" height="327" /></p>
<p style="text-align: justify">The second rule caches all web pages accessed by users who have nothing in their shopping carts or history (when the shopping cart is not empty or when the user history is saved, there is no point in page caching). As you can see in the screen capture below, this is accomplished by looking at $_SESSION variables and by splitting according to $_SERVER['REQUEST_URI'] in addition to the QUERY_STRING.</p>
<p align="center"><a rel="attachment wp-att-953" href="http://www.wikigento.com/?attachment_id=953"><img class="aligncenter size-medium wp-image-953" title="ZS - configuration screenshot 2" src="http://www.wikigento.com/wp-content/uploads/2009/07/sc2-499x427.jpg" alt="ZS - configuration screenshot 2" width="499" height="427" /></a></p>
<p>Finally, Zend Optimizer+ has been enabled for optimizing and caching the PHP byte-code.</p>
<p style="text-align: justify">As you can see, Zend Page Cache seems a very powerful feature. It needs fine tuning and better configuration, but let's see results :</p>
<h2>Homepage / 80 000 products catalog</h2>
<p style="text-align: center" align="center">
<p align="center"><a rel="attachment wp-att-954" href="http://www.wikigento.com/?attachment_id=954"><img class="size-medium wp-image-954 aligncenter" title="Graph3 : comparison between 1.3, 1.3 + FC, 1.3+ZS, 1.3+FC+ZS" src="http://www.wikigento.com/wp-content/uploads/2009/07/graph3-499x254.jpg" alt="Graph3 : comparison between 1.3, 1.3 + FC, 1.3+ZS, 1.3+FC+ZS" width="499" height="254" /></a></p>
<p style="text-align: justify">Load on main page doesn't prove very constructive, although, on heavy load (40 concurrent requests), Zend Server (with or without page cage) is slightly better than basic mod-php, but almost no real improvements on this test. A 5% or less win is not to be taken seriously as it is the error margin of the tests.</p>
<h2>Full visit / 80k products</h2>
<p style="text-align: center" align="center"><a rel="attachment wp-att-958" href="http://www.wikigento.com/?attachment_id=958"><img class="size-medium wp-image-958 aligncenter" title="Graph4 : Full visit, 80K product comparison chart" src="http://www.wikigento.com/wp-content/uploads/2009/07/graph4-499x254.jpg" alt="Graph4 : Full visit, 80K product comparison chart" width="499" height="254" /></a></p>
<p style="text-align: justify">Full visit graphic speaks for itself, whatever the load, Zend Server with Page Cache and Flat Catalog make a big difference.</p>
<p style="text-align: justify">Comparing a 1.3 with flat catalog with a the same configuration but with a Zend Community installed instead of just APC, our server yield up to 15% more performances, just using a free edition of ZS.</p>
<p style="text-align: justify">If we use a full Zend server (the licensed one including the page cache) on this 1.3 flat catalog, our server goes up to 30% more performances!</p>
<p>Mod PHP + APC -&gt; ZS: +15%<br />
Mod PHP + APC -&gt; ZS licensed edition: +30%</p>
<h1>5. Response time</h1>
<p><BR></p>
<h2>Homepage / 80k products</h2>
<p align="center"><a rel="attachment wp-att-959" href="http://www.wikigento.com/?attachment_id=959"><img class="aligncenter size-medium wp-image-959" title="Graph5 : load time !" src="http://www.wikigento.com/wp-content/uploads/2009/07/graph5-500x244.jpg" alt="Graph5 : load time !" width="500" height="244" /></a></p>
<p style="text-align: justify">This graph show response time on the homepage measured during a load. No match on this test, under a good load, ZS, community or licensed edition, gives up a 35% boost in the load time, good to take.</p>
<h2>Full visit / 80k products</h2>
<p style="text-align: center"><a rel="attachment wp-att-961" href="http://www.wikigento.com/?attachment_id=961"><img class="size-medium wp-image-961 aligncenter" title="Graph6 : full navigation load time comparison chart" src="http://www.wikigento.com/wp-content/uploads/2009/07/graph61-500x244.jpg" alt="Graph6 : full navigation load time comparison chart" width="500" height="244" /></a></p>
<p style="text-align: justify">Page Cache provides a better response time over a full visit of the site, even under very heavy load. As the difference remains thin, I would conclude it to be identical in that condition. However, the benefits of the page cache under a standard load remains a must have. Once again, a 35% win is to be considered as a reference value under a good load whether you are using a community or licensed version.</p>
<p style="text-align: justify">Under medium or light load, the page cache is giving a lot more power than the community edition can do. This strange result is probably mainly due to the page cache mechanism which prove to be not that efficient under heavy load because the system is using its resource in a different way.<br />
We didn't had time to check if it was a False cache sharing effect on L2 or L3 processor cache or a Linux or ZS issue but the test has been runned several times yielding the same results.</p>
<p style="text-align: justify">So keep in mind that the benefits of the ZS Page cache mechanism is going to be less and less active as the server load gets high. Under a usual load, a reasonable load lets say, the Page Cache algorithm gives a nice boost to the loading time, driving it down for ~40%.</p>
<h1>6. Additional technical details about the tests</h1>
<p><BR></p>
<h2>Sample data</h2>
<p>All tests were run with generated sample data (provided by Varien)</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="text-align: center" width="213" valign="top">Parameter</td>
<td style="text-align: center" width="213" valign="top">10k</td>
<td style="text-align: center" width="213" valign="top">80k</td>
</tr>
<tr>
<td style="text-align: center" width="213" valign="top">Categories</td>
<td style="text-align: center" width="213" valign="top">251</td>
<td style="text-align: center" width="213" valign="top">1576</td>
</tr>
<tr>
<td style="text-align: center" width="213" valign="top">Category * product associations</td>
<td style="text-align: center" width="213" valign="top">24690</td>
<td style="text-align: center" width="213" valign="top">202743</td>
</tr>
<tr>
<td style="text-align: center" width="213" valign="top">Products</td>
<td style="text-align: center" width="213" valign="top">10001</td>
<td style="text-align: center" width="213" valign="top">78994</td>
</tr>
</tbody>
</table>
<h2>Description of the tests</h2>
<h3>Main page test</h3>
<p>Each concurrent thread loads the main page, without storing the cookies to simulate simultaneous users.</p>
<h3>Full visit test</h3>
<p style="text-align: justify">We have a list requests based on a visit done with a real browser. Each concurrent thread loads each item one after another as fast as possible, and restarts after deleting all its cookies. This simulates simultaneous users, except that simultaneous.</p>
<p>List of requested pages for the 80k database (with POST information when it applies):</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p938code1'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p9381"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
</pre></td><td class="code" id="p938code1"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;</span>span <span style="color: #007800;">style</span>=<span style="color: #ff0000;">&quot;font-size: xx-small;&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>favicon.ico<span style="color: #000000; font-weight: bold;">&lt;/</span>span<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;</span>span <span style="color: #007800;">style</span>=<span style="color: #ff0000;">&quot;font-size: xx-small;&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>js<span style="color: #000000; font-weight: bold;">/</span>index.php?<span style="color: #007800;">c</span>=auto<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">f</span>=,prototype<span style="color: #000000; font-weight: bold;">/</span>prototype.js,prototype<span style="color: #000000; font-weight: bold;">/</span>validation.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>builder.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>effects.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>dragdrop.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>controls.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>slider.js,varien<span style="color: #000000; font-weight: bold;">/</span>js.js,varien<span style="color: #000000; font-weight: bold;">/</span>form.js,varien<span style="color: #000000; font-weight: bold;">/</span>menu.js,mage<span style="color: #000000; font-weight: bold;">/</span>translate.js,mage<span style="color: #000000; font-weight: bold;">/</span>cookies.js
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>css<span style="color: #000000; font-weight: bold;">/</span>reset.css
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>css<span style="color: #000000; font-weight: bold;">/</span>menu.css
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>css<span style="color: #000000; font-weight: bold;">/</span>print.css
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>css<span style="color: #000000; font-weight: bold;">/</span>clears.css
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>css<span style="color: #000000; font-weight: bold;">/</span>boxes.css
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>body_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>logo.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>btn_mini_search.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>mini_search_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>nav_bg.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>nav_divider.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>main_container_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>shop_access_pipe.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>base_mini_head_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>col_left_callout.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>header_top_container_bg.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>icon_table.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>icon_newspaper.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>icon_tag_green.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>icon_basket.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>col_right_callout.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>footer_info_separator.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>main_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">736</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>layered_nav_head_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>layered_nav_narrowed_category_heading.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>narrow_by_set.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>narrow_by_dd_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>pager_arrow_right.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>sort_asc_arrow.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span>1small_image<span style="color: #000000; font-weight: bold;">/</span>135x135<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>small_image.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>pager_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">736</span>?<span style="color: #007800;">attribute_864</span>=<span style="color: #000000;">306</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>list_remove_btn.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>narrow_category_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>narrow_by_li_by.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">736</span>?<span style="color: #007800;">attribute_864</span>=<span style="color: #000000;">306</span><span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">price</span>=<span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">%</span>2C100
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">736</span>?<span style="color: #007800;">attribute_864</span>=<span style="color: #000000;">306</span><span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">price</span>=<span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">%</span>2C100<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">p</span>=<span style="color: #000000;">2</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>pager_arrow_left.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">736</span>?<span style="color: #007800;">attribute_864</span>=<span style="color: #000000;">306</span><span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">price</span>=<span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">%</span>2C100<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">p</span>=<span style="color: #000000;">3</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">736</span><span style="color: #000000; font-weight: bold;">/</span>gtx14049.html
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>js<span style="color: #000000; font-weight: bold;">/</span>index.php?<span style="color: #007800;">c</span>=auto<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">f</span>=,prototype<span style="color: #000000; font-weight: bold;">/</span>prototype.js,prototype<span style="color: #000000; font-weight: bold;">/</span>validation.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>builder.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>effects.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>dragdrop.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>controls.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>slider.js,varien<span style="color: #000000; font-weight: bold;">/</span>js.js,varien<span style="color: #000000; font-weight: bold;">/</span>form.js,varien<span style="color: #000000; font-weight: bold;">/</span>menu.js,mage<span style="color: #000000; font-weight: bold;">/</span>translate.js,mage<span style="color: #000000; font-weight: bold;">/</span>cookies.js,varien<span style="color: #000000; font-weight: bold;">/</span>product.js,calendar<span style="color: #000000; font-weight: bold;">/</span>calendar.js,calendar<span style="color: #000000; font-weight: bold;">/</span>lang<span style="color: #000000; font-weight: bold;">/</span>calendar-en.js,calendar<span style="color: #000000; font-weight: bold;">/</span>calendar-setup.js
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>js<span style="color: #000000; font-weight: bold;">/</span>calendar<span style="color: #000000; font-weight: bold;">/</span>calendar-win2k-<span style="color: #000000;">1</span>.css
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>image<span style="color: #000000; font-weight: bold;">/</span>265x<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>image.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>product_essential_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>product_collateral_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>dotted_divider.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>icon_tag_add.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>checkout<span style="color: #000000; font-weight: bold;">/</span>cart<span style="color: #000000; font-weight: bold;">/</span>add<span style="color: #000000; font-weight: bold;">/</span>uenc<span style="color: #000000; font-weight: bold;">/</span>aHR0cDovL3Rlc3RtMTIudGVzdC5uYnMtc3lzdGVtLmNvbS9jYXRlZ29yeS03MzYvZ3R4MTQwNDkuaHRtbD9fX19TSUQ9VQ,,<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">67952</span><span style="color: #000000; font-weight: bold;">/</span> POST <span style="color: #007800;">product</span>=<span style="color: #000000;">67952</span><span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">related_product</span>=<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">qty</span>=
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>checkout<span style="color: #000000; font-weight: bold;">/</span>cart<span style="color: #000000; font-weight: bold;">/</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>js<span style="color: #000000; font-weight: bold;">/</span>index.php?<span style="color: #007800;">c</span>=auto<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">f</span>=,prototype<span style="color: #000000; font-weight: bold;">/</span>prototype.js,prototype<span style="color: #000000; font-weight: bold;">/</span>validation.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>builder.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>effects.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>dragdrop.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>controls.js,scriptaculous<span style="color: #000000; font-weight: bold;">/</span>slider.js,varien<span style="color: #000000; font-weight: bold;">/</span>js.js,varien<span style="color: #000000; font-weight: bold;">/</span>form.js,varien<span style="color: #000000; font-weight: bold;">/</span>menu.js,mage<span style="color: #000000; font-weight: bold;">/</span>translate.js,mage<span style="color: #000000; font-weight: bold;">/</span>cookies.js,varien<span style="color: #000000; font-weight: bold;">/</span>weee.js
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>btn_proceed_to_checkout.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>btn_trash.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>thumbnail<span style="color: #000000; font-weight: bold;">/</span>75x<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>thumbnail.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>success_msg_icon.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>icon_asterick.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>icon_lorry.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>data_table_th_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>base_mini_actions_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">736</span><span style="color: #000000; font-weight: bold;">/</span>gtx14049.html
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>thumbnail<span style="color: #000000; font-weight: bold;">/</span>50x50<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>thumbnail.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">1497</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>small_image<span style="color: #000000; font-weight: bold;">/</span>135x135<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>small_image.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">1497</span>?<span style="color: #007800;">attribute_864</span>=<span style="color: #000000;">305</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">1497</span><span style="color: #000000; font-weight: bold;">/</span>npt25-a.html
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>image<span style="color: #000000; font-weight: bold;">/</span>265x<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>image.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>checkout<span style="color: #000000; font-weight: bold;">/</span>cart<span style="color: #000000; font-weight: bold;">/</span>add<span style="color: #000000; font-weight: bold;">/</span>uenc<span style="color: #000000; font-weight: bold;">/</span>aHR0cDovL3Rlc3RtMTIudGVzdC5uYnMtc3lzdGVtLmNvbS9jYXRlZ29yeS0xNDk3L25wdDI1LWEuaHRtbD9fX19TSUQ9VQ,,<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">25870</span><span style="color: #000000; font-weight: bold;">/</span> POST <span style="color: #007800;">product</span>=<span style="color: #000000;">25870</span><span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">related_product</span>=<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">qty</span>=
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>checkout<span style="color: #000000; font-weight: bold;">/</span>cart<span style="color: #000000; font-weight: bold;">/</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>thumbnail<span style="color: #000000; font-weight: bold;">/</span>75x<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>thumbnail.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">3</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>thumbnail<span style="color: #000000; font-weight: bold;">/</span>50x50<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>thumbnail.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>category-<span style="color: #000000;">3</span>?<span style="color: #007800;">price</span>=<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">%</span>2C1000
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>checkout<span style="color: #000000; font-weight: bold;">/</span>cart<span style="color: #000000; font-weight: bold;">/</span>add<span style="color: #000000; font-weight: bold;">/</span>uenc<span style="color: #000000; font-weight: bold;">/</span>aHR0cDovL3Rlc3RtMTIudGVzdC5uYnMtc3lzdGVtLmNvbS9jYXRlZ29yeS0zP3ByaWNlPTQlMkMxMDAwJmNhdD0zNyZfX19TSUQ9VQ,,<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">4642</span><span style="color: #000000; font-weight: bold;">/</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>checkout<span style="color: #000000; font-weight: bold;">/</span>cart<span style="color: #000000; font-weight: bold;">/</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>checkout<span style="color: #000000; font-weight: bold;">/</span>onepage<span style="color: #000000; font-weight: bold;">/</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>js<span style="color: #000000; font-weight: bold;">/</span>varien<span style="color: #000000; font-weight: bold;">/</span>accordion.js
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>js<span style="color: #000000; font-weight: bold;">/</span>opcheckout.js
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>opc_off_head_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>opc-ajax-loader.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>btn_window_close.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>cvv.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>multi_address_box_bg.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>skin<span style="color: #000000; font-weight: bold;">/</span>frontend<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>btn_place_order.gif
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>catalogsearch<span style="color: #000000; font-weight: bold;">/</span>ajax<span style="color: #000000; font-weight: bold;">/</span>suggest<span style="color: #000000; font-weight: bold;">/</span> POST <span style="color: #007800;">q</span>=<span style="color: #000000;">45</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>catalogsearch<span style="color: #000000; font-weight: bold;">/</span>ajax<span style="color: #000000; font-weight: bold;">/</span>suggest<span style="color: #000000; font-weight: bold;">/</span> POST <span style="color: #007800;">q</span>=<span style="color: #000000;">456</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>catalogsearch<span style="color: #000000; font-weight: bold;">/</span>result<span style="color: #000000; font-weight: bold;">/</span>?<span style="color: #007800;">q</span>=<span style="color: #000000;">456</span><span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">x</span>=<span style="color: #000000;">17</span><span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #007800;">y</span>=<span style="color: #000000;">8</span>
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>small_image<span style="color: #000000; font-weight: bold;">/</span>135x135<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>small_image.jpg
http:<span style="color: #000000; font-weight: bold;">//</span>test80k<span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>thumbnail<span style="color: #000000; font-weight: bold;">/</span>50x50<span style="color: #000000; font-weight: bold;">/</span>5e06319eda06f020e43594a9c230972d<span style="color: #000000; font-weight: bold;">/</span>images<span style="color: #000000; font-weight: bold;">/</span>catalog<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>placeholder<span style="color: #000000; font-weight: bold;">/</span>thumbnail.jpg<span style="color: #000000; font-weight: bold;">&lt;/</span>span<span style="color: #000000; font-weight: bold;">&gt;</span></pre></td></tr></table></div>

<p><BR><br />
<h1>7. Things to test in the next benchmark campaign</h1>
<p><BR></p>
<h2>Mage Compiler</h2>
<p>When running all those tests, 1.3.1.1 version including the Mage optimizer was about to be released and an immediate 1.3.1.2 version followed and we didn't had time to include some tests around this precise point. Let's just consider the fact that this mechanism is mainly made to lower I/O jobs by "compiling" the libraries files all in one or two includes only. If your servers were already using mainly their RAM to work, the performances increase will not be that valuable. But if your servers where low on RAM or using mainly their disks, you should feel confident with using this option which can do great good to your performances!</p>
<h2>Nginx</h2>
<p>We didn't had the required time to consolidate the results involving Nginx + PHP tests. This solution ranked almost every time between Magento 1.3 + FC and Magento 1.3 + Zend server (without Page cache). So this combination yield average performances, not as sharp as a Magento 1.3 + Zend server or any more advanced combination.</p>
<h2>More "customed" visits</h2>
<p>We have used a scenario involving each time a research in the search bar of the website and some "standard" behaviors. A more precise test can be run replaying some real traffic pumped up from apache log on a real site, the customer's behaviors being more realistic even if our scenario was as logical as possible.</p>
<h1>8. Conclusion</h1>
<p><BR><br />
First, let me say that no electrons were armed or injured during these benchmarks. Perhaps one or two CTO were put under constraint and continuous coffee perfusions but all of this was intend for the greater good of E-commerce!</p>
<p>If you wish a more professional conclusion, let's say that using ZS community edition will only do you good and really can replace APC.</p>
<p>If using the licensed version, the Page cache is very efficient (under reasonable load of the servers) and can help using ~25% less machines to achieve similar hosting capacities. If your servers are billed in a "managed hosting" way, having one or two less servers billed per month can make a good difference in the budget.</p>
<p>About Zend Server : this software has many other great functionalities and this paper is only consider the "performances" issues, just pay a visit to Zend Website for a far more complete overview of the product.</p>
<p>Last but not least, creating a server with all optimizations and best practices, based on an a dual AMD 2376 with 8 Go of RAM and using ZS and page cache, you can try to reach up to ~40 000 unique visitors a day corresponding to ~2 500 Magento simultaneous session at maximum load. (if database is separated on a different server and you activate a reverse proxy like Squid or Varnish above your front web servers)<br />
This estimation is deeply linked to the website complexity and user standard behavior but these figures are given for a "standard" site and use, you can usually also expect a ~2 seconds loading time on the homepage.</p>
<p>If we had to sum up a quick dirty, average table of the performances, without any details, we would give that:<a rel="attachment wp-att-981" href="http://www.wikigento.com/?attachment_id=981"><img class="aligncenter size-full wp-image-981" title="graph71" src="http://www.wikigento.com/wp-content/uploads/2009/07/graph71.jpg" alt="graph71" width="259" height="100" /></a></p>
<p>© June 2009, NBS Team,</p>
<p><a href="mailto:rene.amirkhanian@nbs-system.com">René Amirkhanian</a>, <a href="mailto:adrien.urban@nbs-system.com">Adrien Urban</a>, <a href="mailto:philippe.humeau@nbs-system.com">Philippe Humeau</a>,<br />
you can visit us here: <a href="http://www.nbs-system.com/">www.nbs-system.com</a><br />
and reach us at: <a href="mailto:contact@nbs-system.com">contact@nbs-system.com</a> for any comments or corrections (and yes, we do hosting <img class="superemotions" title="Big Grin" alt="Big Grin" border="0" src="http://www.wikigento.com/wp-includes/images/smilies/icon_biggrin.gif" />)</p>
<h1>9. Creative Commons</h1>
<p><BR></p>
<p style="text-align: justify;">This document is released under the creative common license "Attribution-Noncommercial-Share Alike 3.0". Only three companies (NBS System, Zend and Varien) are allowed to use it for commercial purposes.</p>
<p><a rel="attachment wp-att-939" href="http://www.wikigento.com/?attachment_id=939"><img class="aligncenter size-full wp-image-939" title="cc-logo" src="http://www.wikigento.com/wp-content/uploads/2009/07/cc-logo.jpg" alt="cc-logo" width="115" height="40" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/test-bench/magento-zend-server-the-benchmarks/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Je module, tu modules &#8230;</title>
		<link>http://www.wikigento.com/phpzendmagento/je-module-tu-modules/</link>
		<comments>http://www.wikigento.com/phpzendmagento/je-module-tu-modules/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 11:00:31 +0000</pubDate>
		<dc:creator>Fabrice Beck</dc:creator>
				<category><![CDATA[Php/Zend/Magento]]></category>
		<category><![CDATA[général]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[connect]]></category>
		<category><![CDATA[contribution]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=540</guid>
		<description><![CDATA[La modularité est probablement l&#8217;une des fonctionnalités apportées par Magento la plus intéressante, à la fois pour le marchand et pour l&#8217;intégrateur. Cet article est le premier que je consacre aux modules, c&#8217;est un vaste sujet sur lequel il y a beaucoup à dire. Dans ce premier article je vais introduire les modules, leur capacités [...]]]></description>
			<content:encoded><![CDATA[<p>La modularité est probablement l&#8217;une des fonctionnalités apportées par Magento la plus intéressante, à la fois pour le marchand et pour l&#8217;intégrateur.</p>
<p>Cet article est le premier que je consacre aux modules, c&#8217;est un vaste sujet sur lequel il y a beaucoup à dire.<br />
Dans ce premier article je vais introduire les modules, leur capacités et leurs limites.<br />
<span id="more-540"></span><br />
<strong>1. Introduction</strong></p>
<p>Au delà de Magento les plateformes e-commerce ont toutes été confronté à un problème, peut importe le nombre de fonctionnalités proposées, il est impossible de satisfaire les besoins spécifiques de chaque site e-commerce avec une plateforme générique.</p>
<p>L&#8217;intégrateur doit alors modifier la plateforme et l&#8217;adapter aux besoins. Ces modifications peuvent être faîtes de différentes manières selon les plateformes. On distingue 2 types de plateformes celles qui sont modulaires et celles qui ne le sont pas.</p>
<p>Quand on parle de plateforme modulaire on sous-entend surtout un code qui est modulable, en effet toute solution e-commerce possède son code qui est le moteur original de la plateforme, dans Magento on l&#8217;appelle le core.<br />
Personnaliser la plateforme implique donc de pouvoir modifier le moteur afin qu&#8217;il réponde a nos besoins. Ce travail est plus ou moins facilité par la flexibilité que va vous apporter la plateforme choisie et est donc l&#8217;un des critères dans le choix d&#8217;une solution e-commerce.</p>
<p><strong>2. Les ancêtres</strong></p>
<p>Magento s&#8217;étant positionné comme un concurrent direct à OsCommerce je m&#8217;autorise un encart au sujet des modules sur cette plateforme.</p>
<p>Les gens qui ont travaillé avec OsCommerce l&#8217;on connu : (voix venu d&#8217;outre-tombe)<strong>l&#8217;enfer des contributions</strong>.<br />
Plus sérieusement, OsCommerce est l&#8217;exemple parfait d&#8217;une solution qui n&#8217;est presque pas modulaire, je dis presque car elle l&#8217;est tout de même concernant les modules de paiement et de livraison.<br />
Installer une extension sur OsCommerce était long et fastidieux. A la longue on se retrouvait avec un code exotique qui n&#8217;avait plus rien à voir avec le code d&#8217;origine.</p>
<p>Pire, c&#8217;est un cercle vicieux car plus vous modifiez les sources plus il est difficile d&#8217;y apporter de nouvelles modifications. Plus on modifie et plus la probabilité de bug est grande, et surtout en cas de problème grave il y a un risque de se retrouver dans une impasse technique : impossible de diagnostiquer un problème car le code est devenu un véritable capharnaüm.</p>
<p><strong>3. Ce qu&#8217;apporte Magento</strong></p>
<p>On le sait Magento est basé sur une architecture Zend framework, autrement dit Magento respecte un standard créé par Zend qui n&#8217;est autre que le créateur de PHP4 et 5.</p>
<p>Concrètement : Magento est modulaire.</p>
<p>Encore plus concret : le Core est lui même constitué de modules, si je devais donner un exemple ce serait le module de base de Magento qui s&#8217;apelle &laquo;&nbsp;Core&nbsp;&raquo; que vous trouverez dans le répertoire /app/code/core/Mage/Core</p>
<p>Cette architecture à base de modules implique qu&#8217;on pourra en rajouter d&#8217;autres. L&#8217;avantage des modules étant qu&#8217;ils se greffent automatiquement aux autres modules sans que vous ayez besoin de toucher au Core.</p>
<p>Les principaux avantages sont de rester compatibles avec des mises à jours ultérieure et d&#8217;éviter au Core de se transformer en une grosse tumeur à la croissance incontrôlable et ingérable sur la durée.</p>
<p>Mais Magento apporte également une séparation Code/design qui permet de séparer les traitements de l&#8217;affichage, avec d&#8217;autres avantages comme la gestion multi-design.</p>
<p>En plus Magento fourni un outil qui facilite le déploiement des modules au travers Magento Connect. Cette plateforme permet non seulement de référencer tous les modules existants mais également d&#8217;automatiser le processus d&#8217;installation et de mise à jour des modules.</p>
<p><strong>4. Ce que peuvent faire les modules</strong></p>
<p>Voici une liste non-exhaustive de ce peuvent faire les modules<br />
- Apporter de nouvelles fonctionnalités<br />
- Modifier des fonctionnalités existantes<br />
- Ajouter un template et/ou une skin<br />
- Enrichir l&#8217;API (WebService)<br />
- Intercepter des évènements (enregistrement d&#8217;une commande, création d&#8217;un produit, etc &#8230;)</p>
<p><strong>5. Et donc ?</strong><br />
En fait Magento nous offres une boite à outils formidable, les développeurs avec qui j&#8217;ai eu l&#8217;occasion de discuter sont unanime sur ce point : pour du développement Magento est un modèle du genre, efficace et fonctionnel et c&#8217;est ce qu&#8217;on lui demande.</p>
<p>En revanche exit les bidouilles, avec Magento on ne développe plus de l&#8217;approximatif car une connaissance sérieuse de framework est nécessaire, elle peut s&#8217;acquérir à l&#8217;usage mais pour ceux qui se lance compter 2 mois de grosses galères si vous n&#8217;avez jamais mis les pieds dans Magento et/ou Zend.</p>
<p>Ajoutez à ça que le code exploite pleinement la POO (programmation orientée objet) fournie par PHP il est donc important de maîtriser cette forme de programmation puisque Magento use et abuse des classe, héritage, surcharge, il ne manque que le polymorphisme qui n&#8217;existe pas en PHP5.</p>
<p>J&#8217;ai pour habitude de dire que Magento n&#8217;est réellement accessible qu&#8217;aux ingénieurs en développement, c&#8217;est un cliché bien sûr car l&#8217;expérience et la débrouillardise/motivation peut remplacer le diplôme, mais l&#8217;idée est là.</p>
<p>Pour l&#8217;anecdote j&#8217;avais un jour discuté avec le gérant d&#8217;un site e-commerce qui m&#8217;avait confié que ses devs, à l&#8217;aise dans OsCommerce, se trouvèrent complètement à la rue avec Magento et il du faire appel à un prestataire spécialisé, pour autant il ne regrettait pas son choix car Magento est un excellent outil une fois en place.</p>
<p><strong>6. Ensuite &#8230;</strong><br />
J&#8217;écrirai d&#8217;autres articles dans lesquels je rentrerai plus en détail sur la conception des modules, peut être plus sous forme de tutoriaux avec des exemples de codes (merci Philippe pour l&#8217;ajout de la gestion du code dans le blog), en tout cas je compte spécialiser chaque article autour d&#8217;un exemple concret de réalisation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/phpzendmagento/je-module-tu-modules/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flat Catalog dans Magento 1.3 &#8211; Premières impressions!</title>
		<link>http://www.wikigento.com/phpzendmagento/flat-catalog-dans-magento-13-premieres-impressions/</link>
		<comments>http://www.wikigento.com/phpzendmagento/flat-catalog-dans-magento-13-premieres-impressions/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 15:06:20 +0000</pubDate>
		<dc:creator>Frédéric de Gombert</dc:creator>
				<category><![CDATA[Mysql / Base de données]]></category>
		<category><![CDATA[Php/Zend/Magento]]></category>
		<category><![CDATA[eav]]></category>
		<category><![CDATA[flat-catalog]]></category>
		<category><![CDATA[modele de données]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=630</guid>
		<description><![CDATA[La dernière version de Magento est sortie cette nuit et avec elle arrive l&#8217;option tant attendue : le Flat Catalog! Celle-ci a été annoncée par Varien comme salvatrice pour les performances de notre outil e-commerce préféré (le site annonce un bénéfice de 40% sur le temps de chargement des pages en front office et sur [...]]]></description>
			<content:encoded><![CDATA[<p>La dernière version de Magento est sortie cette nuit et avec elle arrive l&#8217;option tant attendue : le Flat Catalog!</p>
<p>Celle-ci a été annoncée par Varien comme salvatrice pour les performances de notre outil e-commerce préféré (le site annonce un bénéfice de 40% sur le temps de chargement des pages en front office et sur l&#8217;utilisation de la mémoire).</p>
<p>Concrètement, que se cache-t-il vraiment derrière cette option &laquo;&nbsp;magique&nbsp;&raquo; et quel impact aura-t-elle sur les prochains projets construits sur la base de cette version?</p>
<p>Avant toute chose, rappelons que Magento repose actuellement sur un modèle de données de type &laquo;&nbsp;EAV&nbsp;&raquo; (Entity-Attribute-Value). Ce qu&#8217;il faut comprendre c&#8217;est qu&#8217;un objet &laquo;&nbsp;Produit&nbsp;&raquo; dans Magento n&#8217;est pas stocké dans une seule table mais éclaté dans un ensemble de tables en fonction des attributs de notre produit. Cette complexification du modèle de données se justifie en grande partie par la souplesse que propose Magento dans le paramétrage de nouvelles caractéristiques pour un produit.</p>
<p>Mais cette souplesse a donc un coût puisqu&#8217;il multiplie de manière importante le nombre de requêtes effectués en base pour un seul produit. On touche donc très vite aux limites de ce modèle dès lors qu&#8217;on travaille avec un catalogue important (plus d&#8217;une dizaine de millier de références). Varien a donc annoncé en début d&#8217;année qu&#8217;ils proposeraient une simplification de ce modèle sous forme d&#8217;une option librement activable depuis le back office pour permettre de basculer vers un modèle de données &laquo;&nbsp;à plat&nbsp;&raquo;.</p>
<p>En regardant de plus près, cette option est un peu plus subtile que ce à quoi on pouvait s&#8217;attendre: une fois le mode &#8216;flat catalog&#8217; activé dans l&#8217;administration, on se retrouve finalement avec deux catalogues: un pour le backoffice, et un pour le front:</p>
<ul>
<li>celui du backoffice reste le catalogue EAV tel qu&#8217;il existe dans la 1.2</li>
<li>le front utilise des nouvelles tables catalog_category_flat et catalog_product_flat</li>
<li> il y a une synchronisation type maître-esclave entre le catalogue backoffice et celui du front</li>
</ul>
<p>Finalement, le &laquo;&nbsp;flat catalog&nbsp;&raquo; du front est en réalité une sorte de table de cache pour le vrai catalogue qui reste en EAV.</p>
<p><span style="text-decoration: underline;">Les avantages de ce fonctionnement:</span></p>
<ul>
<li>la migration est bien plus simple puisqu&#8217;en réalité le format de la base n&#8217;a pas vraiment changé (les tables _flat sont générées à la demande depuis le backoffice)</li>
<li>on peut imaginer facilement avoir une base de données front avec les tables _flat côté frontoffice, séparées physiquement de la base de backoffice, avec le moteur Federated de MySQL qui permet de présenter plusieurs bases de données comme en étant une seule aux applications. De ce fait, la charge sur le front n&#8217;impacte pas le back et inversement</li>
</ul>
<p><span style="text-decoration: underline;">Les inconvénients:</span></p>
<ul>
<li>avec des volumétries très élevées, (certains) écrans du backoffice vont être très lents puisqu&#8217;ils continueront à utiliser le système EAV</li>
<li>les imports devront continuer à se faire dans les tables EAV, d&#8217;où une lenteur au moment de l&#8217;import (à nuancer: si les données importées ne sont pas destinées à être utilisées dans le backoffice, il est peut être possible de les importer directement dans les tables _flat du front)</li>
</ul>
<p>Nos premiers tests sur la base de ce nouveau modèle et d&#8217;un catalogue de plus d&#8217;un million de produits devraient désormais nous fixer assez rapidement sur la pertinence de cette fonctionnalité…</p>
<p>A suivre donc!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/phpzendmagento/flat-catalog-dans-magento-13-premieres-impressions/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Magento le Web Service</title>
		<link>http://www.wikigento.com/phpzendmagento/magento-le-web-service/</link>
		<comments>http://www.wikigento.com/phpzendmagento/magento-le-web-service/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 07:00:36 +0000</pubDate>
		<dc:creator>Fabrice Beck</dc:creator>
				<category><![CDATA[Php/Zend/Magento]]></category>
		<category><![CDATA[général]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=430</guid>
		<description><![CDATA[Le but de cet article est de vous faire découvrir un aspect très important de Magento et pourtant  peu sexy car il s’adresse plus aux développeurs qu’aux marchands. Cette petite bête s’appelle Web Service ou API et derrière ce nom d’insecte se cache l’une des fonctionnalités les plus importantes de Magento dans le cadre de [...]]]></description>
			<content:encoded><![CDATA[<p>Le but de cet article est de vous faire découvrir un aspect très important de Magento et pourtant  peu sexy car il s’adresse plus aux développeurs qu’aux marchands.</p>
<p>Cette petite bête s’appelle Web Service ou API et derrière ce nom d’insecte se cache l’une des fonctionnalités les plus importantes de Magento dans le cadre de l’intégration d’une boutique Magento à un système d’information.</p>
<p><span id="more-430"></span></p>
<p><strong>C’est quoi un Web Service ?</strong></p>
<p>Si je devais illustrer ce qu’est un Web Service je dirais que c’est à Magento ce que le langage des signes est aux sourds. C’est un moyen de communication.</p>
<p><strong>Un moyen de communication mais pour qui ?</strong></p>
<p>Pour tous les logiciels qui auraient besoin de dialoguer avec Magento. Votre logiciel de gestion comptable, de gestion commerciale ou autre.</p>
<p><strong>Pour quoi faire ?</strong></p>
<p>A travers le Web Service un logiciel tiers pourra par exemple récupérer la liste des commandes, ajouter des produits, ajouter des catégories, …<br />
Je parlais au début d’intégration dans le système d’information, vous devez commencer à voir le potentiel de l’API, un logiciel de comptabilité pourra récupérer les commandes et mettre à jour automatiquement votre compta, votre logiciel de suivit des stocks ou de production pourra prendre en compte les volumes de produits commandé et les mettre à jour.</p>
<p><strong>Oui mais ça on le faisait déjà avant</strong></p>
<p>Probablement tant ce genre de fonctionnalité est importante, toutefois les plateformes e-commerce gratuite disposent rarement d’un Web Service natif en fait je n’en connais pas à part Magento. Donc si vous l’aviez fait auparavant vous aviez probablement du faire faire un développement spécifique (mise en place d’un Web Service, envoi de fichier, ou autre).</p>
<p>Donc</p>
<p>L’intérêt premier de ce Web Service est :</p>
<ul>
<li> Sa disponibilité assure d’une part l’homogénéité d’une plateforme Magento à l’autre (le Web Service est le même sur toutes les boutiques Magento)</li>
<li> Accélère l’intégration puisqu’il n’y plus besoin de le développer (réduisant les coûts de développement)</li>
<li> L’aspect Web Service assure que la communication sera bien assurée sans devoir personnaliser la sécurité du site puis qu’un appel standard au Web Service se fait avec le protocole http sur le port 80, il est possible si besoin de passer par du https si on veut sécuriser les données transitant sur le web.</li>
<li> Et enfin on bénéficie de la sécurité intégrée à Magento et du framework Zend.</li>
</ul>
<p><strong>Comment ça marche ?</strong></p>
<p>Sans rentrer dans les détails un Web Service communique avec un langage standardisé que n’importe quel programme est capable de générer : des flux XML.<br />
Magento supporte 2 protocoles de Web Service nativement, vous pouvez utiliser au choix SOAP ou XML-RPC, pour ceux qui ne savent pas les 2 sont du XML, mais la manière de formater les 2 n’est pas la même, l’utilisation de l’un ou l’autre dépendra principalement de l’environnement technique.<br />
Sachez cependant qu’un Web Service ne sait pas parler, il ne sait que répondre il doit donc être sollicité à chaque fois qu’on a besoin d’une information.<br />
Exemple :  Le Web Service ne pourra pas de lui-même envoyer les commandes à votre comptabilité, c’est la comptabilité qui devra solliciter le Web Service et lui demander la liste des commandes.<br />
Et la sécurité ?</p>
<p>Je n’ai pas personnellement fait de test de sécurité mais je pense que cette partie est robuste en voiçi les raisons :</p>
<p>Le Web Service n’expose que 8 méthodes publiquement et aucune de ses méthodes ne permet d&#8217;accéder aux données :</p>
<ul>
<li>startSession()</li>
<li>login(apiUser, apiKey)</li>
<li> endSession(sessionId)</li>
<li> call(sessionId, resourcePath,array arguments)</li>
<li>multiCall(sessionId, array calls,array options)</li>
<li>resources(sessionId)</li>
<li>globalFaults(sessionId)</li>
<li>resourceFaults(sessionId, resourceName)</li>
</ul>
<p>Pour accéder aux données il faut utiliser call ou multiCall, Magento vérifie alors que l’utilisateur a le droit d’utiliser la méthode appelée grâce au système ACL de Zend.<br />
A partir de là j’imagine que ces méthodes publique ont été correctement protégé et qu&#8217;en conséquence la sécurité du site n’est pas compromise.<br />
Toutefois il y a un point qui me chiffonne c’est que les requêtes http et les flux XML sont tout de même facile à intercepter pour qui le veut, or un appel à la méthode login envoie le login et mot de passe en clair, c’est pourquoi je pense qu’il faut privilégier les appels en https.</p>
<p><strong>Et les performances ?</strong></p>
<p>Soyons franc la communication passant par Web Service c’est lent et ça consomme, par exemple voici le flux XML envoyé pour l’authentification, on envoie que 3 paramètres :<br />
&lt;?xml version=&nbsp;&raquo;1.0&#8243;?&gt;<br />
&lt;methodCall&gt;<br />
&lt;methodName&gt;login&lt;/methodName&gt;<br />
&lt;params&gt;<br />
&lt;param&gt;<br />
&lt;value&gt;<br />
&lt;string&gt;Fabrice&lt;/string&gt;<br />
&lt;/value&gt;<br />
&lt;/param&gt;<br />
&lt;param&gt;<br />
&lt;value&gt;<br />
&lt;string&gt;123456&lt;/string&gt;<br />
&lt;/value&gt;<br />
&lt;/param&gt;<br />
&lt;/params&gt;<br />
&lt;/methodCall&gt;<br />
Pour 20 caractères pertinents on en envoie 10x plus à côté, et encore ici c’est de l’XML-RPC, SOAP est encore plus consommateur. De plus les temps de réponses sont longs (on compte en secondes) entre le moment ou on envoie la requête et le moment ou on reçoit la réponse. Et je ne parle pas de la consommation de ressources serveurs liée à l’exécution des requêtes en elle-même, mais à mon avis récupérer la liste des produits d’une boutique en ayant 5000+ pendant les soldes est selon moi une mauvaise idée (qui tente l’expérience ?). Ces aspects ne gâchent en rien l’utilité du Web Service mais il important d’en connaître les défauts si on veut l’exploiter de manière optimale.</p>
<p><strong>Concrètement comment je peux faire appel à l’API ?</strong></p>
<p>La première chose à connaitre est l’adresse du Web Service, elle dépend surtout du type de Web Service que vous souhaitez utiliser :<br />
SOAP : http://www.monsite.com/api/?wsdl<br />
XML-RPC : http://www.monsite.com/api/xmlrpc/</p>
<p>Ensuite cela dépend du langage que vous allez utiliser, commençons par PHP car c’est facile :</p>
<ol>
<li> $client = new SoapClient(&#8216;http://www.monsite.com/api/?wsdl&#8217;);</li>
<li> // Vous pouvez aussi utiliser</li>
<li> // http://www.monsite.com/api/soap/?wsdl</li>
<li> // Si on a besoin de s&#8217;authentifier,</li>
<li> // on récupère le jeton de session</li>
<li> $session = $client-&gt;login(&#8216;apiUser&#8217;, &#8216;apiKey&#8217;);</li>
<li> $result = $client-&gt;call($session, &#8216;module.methode&#8217;);</li>
<li> $result = $client-&gt;call($session, &#8216;module.methode&#8217;, &#8216;arg1&#8242;);</li>
<li> $result = $client-&gt;call($session, &#8216;module.methode&#8217;, array(&#8216;arg1&#8242;, &#8216;arg2&#8242;, &#8216;arg3&#8242;));</li>
<li> // Si on a fini on termine la session</li>
<li>$client-&gt;endSession($session);</li>
</ol>
<p><strong>Faisons un peu de .Net</strong></p>
<p>En .Net c&#8217;est un peu plus compliqué, bien que le framework .Net supporte le SOAP, il y a visiblement un problème de norme entre SOAP Magento et SOAP .Net ce qui rend cette librairie inutilisable.</p>
<p>Il va donc falloir passer par XML-RPC. Malheureusement ce type n&#8217;est pas supporté nativement par .Net, toutefois il existe une très bonne librairie gratuite créé par <a href="http://www.xml-rpc.net/">Cook Computing</a>.</p>
<p>Pour l&#8217;utiliser il va falloir créer l&#8217;interface des méthodes publique du WebService Magento, voici la mienne :</p>
<pre>using System;
using System.Text;
using CookComputing.XmlRpc;
public interface XmlRpcInterfaces : IXmlRpcProxy
{
  [XmlRpcMethod("login")]
  string login(string apiUser, string apiKey);

  [XmlRpcMethod("endSession")]
  bool endSession(string sessionID);

  [XmlRpcMethod("call")]
  XmlRpcStruct[] call(string sessionID, string resourcePath, object[] data);

  [XmlRpcBegin]
  IAsyncResult Begincall(string sessionID, string resourcePath, object[] data);

  [XmlRpcBegin]
  IAsyncResult Begincall(string sessionID, string resourcePath, object[] data, AsyncCallback acb);

  [XmlRpcBegin]
  IAsyncResult Begincall(string sessionID, string resourcePath, object[] data, AsyncCallback acb, object state);

  [XmlRpcEnd]
  XmlRpcStruct[] Endcall(IAsyncResult iasr);
}</pre>
<p>Notez que je n&#8217;ai implémenté que 3 des 8 méthodes publiques et que j&#8217;ai implémenté la méthode call pour pouvoir faire des appels asynchrone (avec du polymorphisme en prime).</p>
<p>Pour l&#8217;utiliser c&#8217;est relativement simple, si je devais reprendre l&#8217;exemple PHP ça nous donnerai en C# :</p>
<ol>
<li> XmlRpcInterfaces proxy = XmlRpcProxyGen.Create&lt;XmlRpcInterfaces&gt;();</li>
<li> XmlRpcStruct[] result;</li>
<li> proxy.Url = @&nbsp;&raquo;http://www.monsite.com/api/xmlrpc/&nbsp;&raquo;;</li>
<li> string session = proxy.login(&laquo;&nbsp;apiUser&nbsp;&raquo;, &laquo;&nbsp;apiKey&nbsp;&raquo;);</li>
<li> result = proxy.call(session, &laquo;&nbsp;module.methode&nbsp;&raquo;, new object[] { });</li>
<li> result = proxy.call(session, &laquo;&nbsp;module.methode&nbsp;&raquo;, new object[] { &laquo;&nbsp;arg1&#8243; });</li>
<li> result = proxy.call(session, &laquo;&nbsp;module.methode&nbsp;&raquo;, new object[] { &laquo;&nbsp;arg1&#8243;, &laquo;&nbsp;arg2&#8243;, &laquo;&nbsp;arg3&#8243; });</li>
<li> proxy.endSession(session);</li>
</ol>
<p><strong>Les appels asynchrone</strong></p>
<p>Ce qu&#8217;il y a de bien avec des langages comme .Net ou Java c&#8217;est la possibilité de faire des appels Asynchrone, plutôt que d&#8217;attendre la réponse du serveur on envoie la requête et on déclenche un évènement dès que l&#8217;on réceptionne la réponse.</p>
<p>C&#8217;est possible à faire avec le WebService de Magento à 2 conditions :<br />
Tout d&#8217;abord il faut implémenter la gestion de l&#8217;appel Asynchrone (déjà fait dans mon exemple pour call) de la méthode.<br />
Ensuite il faut absolument que le serveur Apache soit configuré de manière à pouvoir garder en vie la session, sans ça vous avez toutes les chances que la session expire entre 2 requêtes ou même entre la requête et la réponse.</p>
<p>Dans la plupart des cas les appels asynchrone ne sont pas possible car Apache n&#8217;est pas configuré pour cela par défaut, un moyen de contourner cela est de faire des appels synchrone dans des threads séparés.</p>
<p><strong>Etendre le Web Service</strong></p>
<p>Utiliser le Web Service est ce dont vous avez besoin mais les traitements proposés ne vous conviennent pas ?<br />
Qu&#8217;a cela ne tienne, il est parfaitement possible de créer de nouvelles méthodes dans l&#8217;API en les implémentant dans un module Magento. Je ne ferai pas de cours sur ce point maintenant car j&#8217;ai l&#8217;intention d&#8217;écrire un article dédié aux modules ultérieurement. Sachez juste que c&#8217;est facile à faire.</p>
<p><strong>Conclusion</strong></p>
<p>Le Web Service c&#8217;est le bien.</p>
<p>Son utilisation est un vrai bonheur pour relier des applications à Magento avec les exemples que j&#8217;ai donné vous devriez pouvoir l&#8217;utiliser vous même assez facilement. Pour les marchands ou futur marchands vous connaissez désormais un des potentiels de Magento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/phpzendmagento/magento-le-web-service/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

