<?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>Le blog des équipes... &#187; PHP</title>
	<atom:link href="http://www.bysoft.fr/blog/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bysoft.fr/blog</link>
	<description></description>
	<lastBuildDate>Wed, 01 Feb 2012 04:52:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Etre Toujours Publiable &#8211; Déploiement automatisé de site web</title>
		<link>http://www.bysoft.fr/blog/php/etre-toujours-publiable/</link>
		<comments>http://www.bysoft.fr/blog/php/etre-toujours-publiable/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 06:06:34 +0000</pubDate>
		<dc:creator>DamienSeguy</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Technologies]]></category>

		<guid isPermaLink="false">http://www.bysoft.fr/blog/?p=885</guid>
		<description><![CDATA[Le déploiement automatisé a un effet important sur le code: il conduit à ce qu’il soit prêt à déployer. A tout moment du cycle de développement, le script de déploiement peut être lancé pour faire une mise en production ou une livraison : en termes simples, pour être publié.
« Release early, release often »
Cela s&#8217;apparente à la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Le déploiement automatisé a un effet important sur le code: il conduit à ce qu’il soit prêt à déployer. A tout moment du cycle de développement, le script de déploiement peut être lancé pour faire une mise en production ou une livraison : en termes simples, pour être publié.</p>
<p><strong>« Release early, release often »</strong></p>
<p>Cela s&#8217;apparente à la stratégie « Release early, release often »: déployer souvent montre que le projet progresse. Ces progrès ne sont pas toujours importants : parfois même, des bugs sont publiés. Mais durant la période de développement, c&#8217;est une situation normale. De toutes manières, une nouvelle version corrigera bientôt le problème. Et puisque le bug a été identifié tôt dans le processus, il sera donc plus facile à corriger, et aussi, plus important, plus facile à pardonner.</p>
<p><strong>Toujours pas fini…</strong></p>
<p>Comment peut-on fournir un code qui puisse toujours être mis à disposition ?</p>
<p>Eh bien, tout d&#8217;abord, entre la version et le code actuel, il ya une pièce d&#8217;ingénierie appelée SMC: Git, SVN, Mercurial, fossiles, CVS &#8230;( appelez cela comme vous voulez !), qui sera la principale source pour la version. Tant que vous ne commitez pas dans le SMC, votre code ne peut pas être publiable: il peut ne pas être compilé, ni être propre, ou non fonctionnel. Tant qu’il n’est pas commité,  le code n&#8217;existe pas.</p>
<p>Une fois qu&#8217;il est commité, il doit faire partie intégrante de l&#8217;application. Et pour être publiable, il ne doit pas casser l&#8217;application. La première vérification sera la compilation par PHP : si le code n’est pas compilé, alors, il ne sera pas publiable.<br />
<strong></strong></p>
<p><strong>Développement bouchon de champagne</strong></p>
<p>Le codage total, jusqu&#8217;à ce qu&#8217;il fonctionne, est aussi appelé le développement bouchon de champagne : vous ne savez le son que fera le bouchon de bouteille de champagne qu’à son ouverture. A ce stade, vous aurez eu soin d’avoir tous vos amis autour de vous, parce que si le bouchon saute, alors vous voudrez remplir quelques verres et trinquer. Par contre, si cela échoue, tous vos amis seront là pour vous remonter le moral ou se moquer de vous (oui, les amis font aussi cela).<br />
Cette allégorie peut être appliquée au développement : quand le code est attendu depuis trop longtemps, les attentes s&#8217;accumulent, et commencent à grandir, jusqu&#8217;à devenir extrêmes. Puisque vous vous concentrez que sur le code, et laissez les utilisateurs dans le noir, alors ils trouveront les informations avec leur seul outil à leur disposition : l&#8217;imagination. Voilà comment vous vous retrouvez avec un beau projet, bien en deçà des attentes.<br />
<strong></strong></p>
<p><strong>Largeur d&#8217;abord</strong></p>
<p>L&#8217;autre approche est de rendre le code prêt dès que possible, même s’il n’est pas complet. Compiler est une première étape. Le fonctionnement complet n’est seulement que le troisième niveau. Entre les deux, vous avez le niveau «incomplet» : il fonctionne mais pas entièrement.</p>
<p>Prenons un exemple : comment travailler sur un module imaginaire de Drupal addressbook et l’avoir  fonctionnel pendant tout le dévelopement ? Si un tel module nécessite de plusieurs jours de travail, alors il ne fonctionnera pas entièrement les premiers jours. À ce stade, il n&#8217;est pas important de l&#8217;avoir entièrement opérationnel : nous voulons juste qu’il fonctionne.</p>
<p>Imaginez le stade précoce du module Drupal: le module lui-même est créé, basé sur son nom, avec beaucoup de « hooks » vides. Cela va compiler mais ne fera rien. Cependant, cela est publiable : il peut être envoyé sur une nouvelle version et n&#8217;ajoutera rien &#8230; à l&#8217;application finale.<br />
Puis, à partir de cette base, vous pouvez commencer à ajouter de nouvelles pièces. Imaginez que vous travaillez sur le carnet d&#8217;adresses.</p>
<p>Vous avez alors différentes possibilités pour commencer à travailler : vous pouvez commencer à partir de la structure de la base de données et de mettre à jour hook_install ; puis ajouter quelques valeurs dans la base de données, et enfin travailler dans hook_view, de sorte que vous pouvez fournir une vue sur les données existantes, puis le même hook_view pour un formulaire requérant des données.<br />
Vous pouvez également démarrer à partir hook_menu pour afficher le menu et un accès à votre nouveau module, puis  hook_view pour l&#8217;afficher. Enfin hook_install pour ajouter une nouvelle CSS au système de modèles. Vous pouvez aussi commencer par le panneau d&#8217;administration, les modèles, etc…<br />
Chacune de ces approches vous donnera quelque chose de fonctionnel : vous et les utilisateurs seront en mesure d&#8217;exécuter cette application, et de voir le travail effectué ; bien sûr pas tout entièrement : le développement n&#8217;est pas encore fait mais seulement une partie.<br />
C&#8217;est la principale différence avec le développement en profondeur. Une approche en profondeur résoud tous les problèmes qui se présentent : Drupal hooks, structure de la base de données, modèle, tests et déploiement. À tout moment, c&#8217;est un travail en cours et et rien n&#8217;est publiable : ce qui est fait est bien fait, mais on ne peut le faire marcher.</p>
<p>En fin de compte il ya deux approches différentes pour que cela soit toujours publiable.</p>
<ul>
<li>Croissance organique du code : commencer par déposer tout le code requis pour le faire fonctionner. Ensuite, ajoutez nouvelle fonctionnalité au dessus d&#8217;un tel code. J&#8217;appelle aussi cela « ajouter de la chair autour de l&#8217;os », basé sur le cliché du squelette. Vous finirez probablement avec beaucoup de fonctions vides ou constantes, qui seront des emplacements, ou « placeholders » pour un code plus complexe et ultérieur. Compter le nombre de ces emplacements est un bon indicateur des progrès réalisés.</li>
</ul>
<ul>
<li>Code visible : cette approche est centrée sur les utilisateurs (ou clients, si vous préférez) . Ne travaillez que sur ce qui est visible. Ce formulaire de 120 champs ne commencera qu’avec deux formulaires. Puis, il affichera 3, puis 4, puis 12, puis 30, etc … A chaque fois, il va ajouter de nouvelles fonctionnalités. Et si c&#8217;est un tunnel  de paiement en 12 étapes, alors il devrait commencer par 1 étape de paiement, puis 2, etc &#8230; Gardez à l&#8217;esprit que les utilisateurs ne mesurent la progression que sur ce qu&#8217;ils voient (c&#8217;est-à-dire la vue), et non sur la quantité de travail ou de code que vous fournissez.</li>
</ul>
<p>Si vous prévoyez de garder votre code publiable, vous devrez être en mesure de répondre à cette simple question : puis-je simplement déployer mon code maintenant ?</p>
<p>Cela vous rendra prêt pour n&#8217;importe quelle situation pouvant survenir en dehors  du planning : problème de sécurité, publication en urgence pour démonstration, changement soudain dans le planning client, ou même, un changement de développeur. Un code qui fonctionne bénéficiera toujours  à la personne suivante, plutôt qu’elle se batte avec un ensemble de tâches partiellement achevées.</p>
<p style="text-align: right;">Damien Seguy</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bysoft.fr/blog/php/etre-toujours-publiable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimiser les performances de Magento</title>
		<link>http://www.bysoft.fr/blog/php/optimiser-les-performances-de-magento/</link>
		<comments>http://www.bysoft.fr/blog/php/optimiser-les-performances-de-magento/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 16:35:08 +0000</pubDate>
		<dc:creator>gregoire</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[e-Commerce]]></category>

		<guid isPermaLink="false">http://www.bysoft.fr/blog/?p=499</guid>
		<description><![CDATA[Cet article est une traduction des principales recommandations du Livre Blanc de Varien au sujet de l&#8217;optimisation des performances de Magento.
Planifier, déployer et configurer l’environnement de Magento Enterprise Edition nécessite sans aucun doute d&#8217;apporter une grande attention aux moindres détails afin d&#8217;en obtenir les meilleures performances. La plate-forme physique, la performance du réseau, la configuration [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article est une traduction des principales recommandations du <a class="download" title="Magento Performance WhitePaper" href="http://info.magento.com/rs/magentocommerce/images/Magento_PerformanceWhitepaper-EEv1-9.1.pdf" target="_blank">Livre Blanc de Varien</a> au sujet de l&#8217;optimisation des performances de Magento.</p>
<p>Planifier, déployer et configurer l’environnement de Magento Enterprise Edition nécessite sans aucun doute d&#8217;apporter une grande attention aux moindres détails afin d&#8217;en obtenir les meilleures performances. La plate-forme physique, la performance du réseau, la configuration et l’optimisation des différents services ainsi que la configuration avancée de Magento Enterprise Edition jouent tous un rôle important pour aboutir au meilleur rendement possible sur votre configuration spécifique. Ce qui suit est la revue des points essentiels abordés dans le livre blanc de Varien:</p>
<p>•<span style="white-space: pre;"> </span>Il est fortement recommandé d’<strong>optimiser les configurations Apache et MySQL</strong>. Cela peut permettre d’augmenter les performances de 55 à 70%, en particulier sur les pages dynamiques. MySQL et Apache sont en effet configurés par défaut pour utiliser beaucoup moins de ressources que ce qu’un serveur moyen peut désormais fournir, et ne sont par conséquent pas en mesure de prendre en charge un nombre élevé de transactions simultanées. Cela peut conduire à une charge irrégulière du serveur et un comportement général imprévisible.</p>
<p>•<span style="white-space: pre;"> </span>L’ajout d&#8217;un <strong>accélérateur PHP</strong> est un autre aspect important de la configuration de l’environnement de Magento Enterprise Edition. eAccelerator affiche de bons résultats avec une augmentation de 40% à 600%. D&#8217;après nos tests, APC est encore plus efficace affichant un gain de performance supplémentaire de 15 à 20% par rapport à eAccelerator.</p>
<p>•<span style="white-space: pre;"> </span>Activer le <strong>cache </strong>sur les sites de production est essentiel. La désactivation du cache peut provoquer un ralentissement de l&#8217;interface de la boutique d’un facteur de 5 à 6 et une réactivité moindre sous charge.</p>
<p>•<span style="white-space: pre;"> </span>Lors de la configuration de Magento Enterprise Edition sur un serveur unique, il est convenable d’utiliser le système de cache par défaut (basé sur le système de fichiers) ou alors APC, qui donne des résultats similaires. Toutefois, en cas d’installation sur des nœuds web multiples, il est préférable d’utiliser  <strong>memcached</strong>. En effet APC et le système de cache par fichiers requièrent une gestion supplémentaire pour synchroniser les données entre les nœuds.</p>
<p>•<span style="white-space: pre;"> </span>L’activation de la fonctionnalité <strong>Full Page Caching </strong>peut améliorer les performances de Magento Enterprise Edition pour toute page avec du contenu statique (page d&#8217;accueil ou autres pages CMS). Ainsi, si vous envisagez d&#8217;avoir une page d&#8217;accueil statique et que vous utilisez plusieurs pages d’arrivée votre site web, il est fortement recommandé d’activer la fonctionnalité Full Page Caching.</p>
<p>•<span style="white-space: pre;"> </span>Dans une configuration à serveur unique, il n&#8217;est pas nécessaire de modifier le système de stockage de sessions par défaut (système de fichiers), car il donne les meilleurs résultats. Toutefois, dans un environnement en cluster, si l&#8217;équilibreur de charge utilisé ne peut pas associer les demandes des clients avec des nœuds web spécifiques, en se basant sur l&#8217;adresse IP ou les cookies du client, il peut être nécessaire d&#8217;utiliser soit <strong>memcached</strong>, soit le <strong>stockage de sessions en base de données</strong>. Le stockage des sessions dans memcached donne des résultats proches de ceux du stockage par défaut (ou légèrement inférieurs, entre 1 et 2%). Le stockage de session en base de données devrait être utilisé dans un environnement de cluster seulement en dernier recours, dans le cas où le stockage memcached ne pourrait pas être utilisé.</p>
<p>•<span style="white-space: pre;"> </span>L’installation du module de <strong>Compilation </strong>de Magento Enterprise Edition et l’activation de la compilation peuvent donner un gain de performances supplémentaire de 10 à 15%.</p>
<p>•<span style="white-space: pre;"> </span>Si vous souhaitez installer et configurer le moteur de recherche <strong>Apache Solr</strong>, il est recommandé d&#8217;activer le support du moteur de recherche Solr dans les options de configuration de la recherche catalogue. La qualité de la recherche augmente de façon significative, même dans le cas où le catalogue est peu fourni, et on peut constater un petit gain de performance (pas plus de 25% sur la navigation catalogue et 14% sur la recherche).</p>
<p>•<span style="white-space: pre;"> </span>L&#8217;utilisation de <strong>processeurs multi-cœurs</strong> modernes et de <strong>disques durs rapides </strong>améliore davantage les résultats. Un serveur simple-cœur, de bas niveau, avec un unique disque dur SATA et 4 Go de RAM installés est capable de traiter environ 9 trans/sec lors des tests sur la page d&#8217;accueil et jusqu&#8217;à 4 trans/sec au cours d&#8217;une session client moyenne. Un serveur dual-core avec un disque dur SATA est capable de gérer 18 trans/sec sur page d’accueil et jusqu&#8217;à 7 trans/sec pour des tests d’URL de session client, tandis qu’un serveur 8-core avec des disques durs 15K en RAID1 peut gérer 38 trans/sec sur page d&#8217;accueil et environ 17 trans/sec pour des tests d’URL de session client, avec des centaines de sessions simultanées, ce qui permet de prendre en charge plus de chargements de pages pour plus de visiteurs.</p>
<p>Magento Enterprise Edition est la première plate-forme Open Source eCommerce basée sur une technologie solide qui vous donne la <strong>flexibilité</strong>, la <strong>configuration</strong>, et les <strong>performances </strong>dont vous avez besoin pour <strong>développer un canal en ligne qui répond aux besoins uniques de votre entreprise</strong>.</p>
<p>En prêtant attention à ces détails de configuration qui peuvent être très poussés, et avec quelques réglages minutieux, <strong>la solidité, stabilité et performances de  Magento Enterprise Edition</strong> vous donnent les moyens de servir de nombreux clients de façon dense et rentable, tout en vous offrant l’avance nécessaire pour <strong>vous différencier de vos concurrents</strong>… et rester devant eux !</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Résumé des recommandations</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Sans aucun doute, planifier, déployer et configurer l’environnement de Magento Enterprise Edition requiert une grande attention aux détails afin d&#8217;en obtenir les meilleures performances. La plate-forme physique, la performance du réseau, la configuration et l’optimisation des différents services ainsi que la configuration avancée de Magento Enterprise Edition jouent tous un rôle important pour aboutir au meilleur rendement possible sur votre configuration spécifique. Ce qui suit est la revue des points essentiels abordés dans ce document.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>Il est fortement recommandé d’optimiser les configurations Apache et MySQL. Cela peut permettre d’augmenter les performances de 55 à 70%, en particulier sur les pages dynamiques. MySQL et Apache sont en effet configurés par défaut pour utiliser beaucoup moins de ressources que ce qu’un serveur moyen peut désormais fournir, et ne sont par conséquent pas en mesure de prendre en charge un nombre élevé de transactions simultanées. Cela peut conduire à une charge irrégulière du serveur et un comportement général imprévisible.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>L’ajout d&#8217;un accélérateur PHP est un autre aspect important de la configuration de l’environnement de Magento Enterprise Edition. eAccelerator affiche de bons résultats avec une augmentation de 40% à 600%. D&#8217;après nos tests, APC est encore plus efficace affichant un gain de performance supplémentaire de 15 à 20% par rapport à eAccelerator.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>Activer le cache sur les sites de production est essentiel. La désactivation du cache peut provoquer un ralentissement de l&#8217;interface de la boutique d’un facteur de 5 à 6 et une réactivité moindre sous charge.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>Lors de la configuration de Magento Enterprise Edition sur un serveur unique, il est convenable d’utiliser le système de cache par défaut (basé sur le système de fichiers) ou alors APC, qui donne des résultats similaires. Toutefois, en cas d’installation sur des nœuds web multiples, il est préférable d’utiliser  memcached. En effet APC et le système de cache par fichiers requièrent une gestion supplémentaire pour synchroniser les données entre les nœuds.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>L’activation de la fonctionnalité Full Page Caching peut améliorer les performances de Magento Enterprise Edition pour toute page avec du contenu statique (page d&#8217;accueil ou autres pages CMS. Ainsi, si vous envisagez d&#8217;avoir une page d&#8217;accueil statique et que vous utilisez plusieurs pages d’arrivée votre site web, il est fortement recommandé d’activer la fonctionnalité Full Page Caching.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>Dans une configuration à serveur unique, il n&#8217;est pas nécessaire de modifier le système de stockage de sessions par défaut (système de fichiers), car il donne les meilleurs résultats. Toutefois, dans un environnement en cluster, si l&#8217;équilibreur de charge utilisé ne peut pas associer les demandes des clients avec des nœuds web spécifiques, en se basant sur l&#8217;adresse IP ou les cookies du client, il peut être nécessaire d&#8217;utiliser soit memcached, soit le stockage de sessions en base de données. Le stockage des sessions dans memcached donne des résultats proches de ceux du stockage par défaut (ou légèrement inférieurs, entre 1 et 2%). Le stockage de session en base de données devrait être utilisé dans un environnement de cluster seulement en dernier recours, dans le cas où le stockage memcached ne pourrait pas être utilisé.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>L’installation du module de Compilation de Magento Enterprise Edition et l’activation de la compilation peuvent donner un gain de performances supplémentaire de 10 à 15%.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>Si vous êtes en mesure d&#8217;installer et de configurer le moteur de recherche Apache Solr, il est recommandé d&#8217;activer le support du moteur de recherche Solr dans les options de configuration de la recherche catalogue. La qualité de la recherche augmente de façon significative, même dans le cas où le catalogue est peu fourni, et on peut constater un petit gain de performance (pas plus de 25% sur la navigation catalogue et 14% sur la recherche).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">•<span style="white-space: pre;"> </span>L&#8217;utilisation de processeurs multi-cœurs modernes et de disques durs rapides améliore davantage les résultats. Un serveur simple-cœur, de bas niveau, avec un unique disque dur SATA et 4 Go de RAM installés est capable de traiter environ 9 trans/sec lors des tests sur la page d&#8217;accueil et jusqu&#8217;à 4 trans/sec au cours d&#8217;une session client moyenne. Un serveur dual-core avec un disque dur SATA est capable de gérer 18 trans/sec sur page d’accueil et jusqu&#8217;à 7 trans/sec pour des tests d’URL de session client, tandis qu’un serveur 8-core avec des disques durs 15K en RAID1 peut gérer 38 trans/sec sur page d&#8217;accueil et environ 17 trans/sec pour des tests d’URL de session client, avec des centaines de sessions simultanées, ce qui permet de prendre en charge plus de chargements de pages pour plus de visiteurs.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Magento Enterprise Edition est la première plate-forme Open Source eCommerce basée sur une technologie solide qui vous donne la flexibilité, la configuration, et les performances dont vous avez besoin pour développer un canal en ligne qui répond aux besoins uniques de votre entreprise. En prêtant attention à ces détails de configuration qui peuvent être très poussés, et avec quelques réglages minutieux, la solidité, stabilité et performances de  Magento Enterprise Edition vous donnent les moyens de servir de nombreux clients de façon dense et rentable, tout en vous offrant l’avance nécessaire pour vous différencier de vos concurrents… et rester devant.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.bysoft.fr/blog/php/optimiser-les-performances-de-magento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le Cache de Magento</title>
		<link>http://www.bysoft.fr/blog/php/le-cache-de-magento/</link>
		<comments>http://www.bysoft.fr/blog/php/le-cache-de-magento/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 07:16:20 +0000</pubDate>
		<dc:creator>lisiane</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bysoft.fr/blog/?p=389</guid>
		<description><![CDATA[LE CACHE DE MAGENTO
Magento possède un système de cache  avancé qui permet  d’accroitre les performances d’un site tout en limitant les accès à la base de données.
Le contenu des templates s’affiche plus rapidement, la navigation entre les pages est plus fluide, en bref, tout ce qui concerne de près ou de loin au chargement de [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">LE CACHE DE MAGENTO</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Magento possède un système de cache  avancé qui permet  d’accroitre les performances d’un site tout en limitant les accès à la base de données.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Le contenu des templates s’affiche plus rapidement, la navigation entre les pages est plus fluide, en bref, tout ce qui concerne de près ou de loin au chargement de vos pages s’en ressent  amélioré…</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Rappel : Qu’est ce qu’un cache ?</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">La mémoire cache est une zone de stockage temporaire où les données fréquemment consultées peuvent être stockées pour un accès plus rapide. Une fois les données stockées dans le cache, ces informations peuvent être utilisées par la suite en accédant à la copie en cache plutôt que de ré-extraire ou recalculer les données d&#8217;origine.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Cache de Magento</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Plusieurs types de cache Magento existent, ils sont ainsi partimentés afin de ne recharger que le stricte nécessaire  en cas de besoin. IL est donc possible de mettre séparément en cache les fichiers propres à la configuration, le layout, les traductions…</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Tous ces caches peuvent être activés ou désactivés directement à partir du backoffice.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Menu : Système &gt; Gestion du Cache</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Par défaut, Magento stocke ses données périssables telles que son cache et ses sessions à l&#8217;emplacement racine du site Magento dans le dossier /var/&#8230;, il est donc possible de vider toutes les sauvegardes du cache en supprimant directement les fichiers de ce dossier.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Besoin spécifique : Exemple d’utilisation de Zend_cache</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Pour encore plus d’optimisation, il est possible de mettre en cache manuellement certains blocks de Magento dont le temps de chargement est trop long.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">- Il est nécessaire de redéfinir un constructeur et de faire un appel à la fonction addData pour prévenir Magento que nous allons ajouter des données au cache.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Trois paramètres sont importants :</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">cache_lifetime : Durée de vie du cache (en secondes) -&gt; par défaut il est à 7200 s</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">cache_tags : Type de bloc mis en cache</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">cache_key : Identifiant de l’ information qui est mise en cache</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">protected function _construct()</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">{</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">$this-&gt;addData(array(</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"><span style="white-space: pre;"> </span>&#8216;cache_lifetime&#8217; =&gt; 3600,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"><span style="white-space: pre;"> </span>&#8216;cache_tags&#8217;    =&gt; array(Mage_Catalog_Model_Product::CACHE_TAG),</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"><span style="white-space: pre;"> </span>&#8216;cache_key&#8217;     =&gt; $this-&gt;getProduct()-&gt;getId()));</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Dans cet exemple, nous voulons réécrire le bloc Mage_Catalog_Model_Product:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">”&#8217;cache_lifetime&#8217; =&gt; 3600” concerne la durée de mise en cache de l’information (soit 3600 secondes).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">”&#8217;cache_tags&#8217;    =&gt; array(Mage_Catalog_Model_Product::CACHE_TAG) ” concerne l’action qui va déclencher le rafraichissement des données (affichage d’une liste de produits).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">”&#8217;cache_key&#8217;     =&gt; $this-&gt;getProduct()-&gt;getId()));” est l’identifiant du produit qui va être recalculé une fois le temps de mise en cache écoulé et l’action (cache_tags) de nouveau enclenchée.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">- La plupart du temps la redéfinition du constructeur n’est pas suffisante, il est donc nécessaire de définir les fonctions séparément, elles feront toutes appel à la classe parent Mage_Core_Block_Abstract-&gt; toHtml().</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">public function getCacheKey(){}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">public function getCacheLifetime(){}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">public function getCacheTags(){}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">À noter qu’il est également possible d’installer certaines extensions qui mettent en place ces caches comme le cache pour les catégories ou le cache pour les produits. Il est cependant conseillé de les utiliser avec prudence car elles peuvent ne pas apporter entière satisfaction et provoquer plusieurs erreurs au cours de leur installation.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Optimisation du cache</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Par défaut, Magento stocke les données propres au cache et aux sessions sur la même partition que le reste des fichiers, donc dans la majorité des cas, sur le disque dur (file system).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Pour optimiser la rapidité d&#8217;accès aux fichiers, il est possible de créer une partition RAM, par exemple via Memcached, et y monter les dossiers racine_magento/var/cache et racine_magento/var/session.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Pour activer Memcached dans Magento, vous devez ajouter le bloc de code suivant dans votre fichier app/etc/local.xml :</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;cache&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;backend&gt;memcached&lt;/backend&gt;&lt;!&#8211; apc / memcached / empty=file &#8211;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;memcached&gt;&lt;!&#8211; memcached cache backend related config &#8211;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;servers&gt;&lt;!&#8211; any number of server nodes can be included &#8211;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;server&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;host&gt;&lt;![CDATA[127.0.0.1]]&gt;&lt;/host&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;port&gt;&lt;![CDATA[11211]]&gt;&lt;/port&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;persistent&gt;&lt;![CDATA[1]]&gt;&lt;/persistent&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;/server&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;/servers&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;compression&gt;&lt;![CDATA[0]]&gt;&lt;/compression&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;cache_dir&gt;&lt;![CDATA[]]&gt;&lt;/cache_dir&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;hashed_directory_level&gt;&lt;![CDATA[]]&gt;&lt;/hashed_directory_level&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;hashed_directory_umask&gt;&lt;![CDATA[]]&gt;&lt;/hashed_directory_umask&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;file_name_prefix&gt;&lt;![CDATA[]]&gt;&lt;/file_name_prefix&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;/memcached&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&lt;/cache&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Attention! Vous devez vous assurer que les variables « host » (ici : 127.0.0.1) et « port » (ici : 11211) soient correctes.  Une fois le fichier sauvegardé les nouveaux paramètres sont tout de suite actifs.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Il existe de nombreuses solutions pour optimiser l’affichage d’un site. Une bonne gestion du cache est l&#8217;une d&#8217;entre elles. Magento met  à disposition des développeurs, une large palette de fonctions qui leur permet d&#8217;adapter le code de façon optimum pour chacun de leurs besoins.</div>
<p>Magento possède un système de cache  avancé qui permet  d’accroitre les performances d’un site tout en limitant les accès à la base de données.</p>
<p>Le contenu des templates s’affiche plus rapidement, la navigation entre les pages est plus fluide, en bref, tout ce qui concerne de près ou de loin au chargement de vos pages s’en ressent  amélioré…</p>
<p class="wp-caption">Rappel : Qu’est ce qu’un cache ?</p>
<p>La mémoire cache est une zone de stockage temporaire où les données fréquemment consultées peuvent être stockées pour un accès plus rapide. Une fois les données stockées dans le cache, ces informations peuvent être utilisées par la suite en accédant à la copie en cache plutôt que de ré-extraire ou recalculer les données d&#8217;origine.</p>
<p class="wp-caption">Cache de Magento</p>
<p>Plusieurs types de cache Magento existent, ils sont ainsi partimentés afin de ne recharger que le strict nécessaire en cas de besoin. Il est donc possible de mettre séparément en cache les fichiers propres à la configuration, le layout, les traductions…</p>
<p>Tous ces caches peuvent être activés ou désactivés directement à partir du backoffice.</p>
<p><em>Menu : Système &gt; Gestion du Cache </em></p>
<div id="attachment_390" class="wp-caption aligncenter" style="width: 585px"><a href="http://www.bysoft.fr/blog/wp-content/uploads/2010/10/magento-menu-cache.jpg"><img class="size-full wp-image-390" title="Cache-Magento" src="http://www.bysoft.fr/blog/wp-content/uploads/2010/10/magento-menu-cache.jpg" alt="Cache-Magento" width="575" height="195" /></a><p class="wp-caption-text">Cache-Magento</p></div>
<p>Par défaut, Magento stocke ses données périssables telles que son cache et ses sessions à l&#8217;emplacement racine du site Magento dans le dossier /var/&#8230;, il est donc possible de vider toutes les sauvegardes du cache en supprimant directement les fichiers de ce dossier.</p>
<p class="wp-caption">Besoin spécifique : Exemple d’utilisation de Zend_cache</p>
<p>Pour encore plus d’optimisation, il est possible de <strong>mettre en cache manuellement certains blocs de Magento</strong> dont le temps de chargement est trop long.</p>
<p>- Il est nécessaire de redéfinir un constructeur et de faire un appel à la fonction <strong>addData </strong>pour prévenir Magento que nous allons ajouter des données au cache.</p>
<p>Trois paramètres sont importants :</p>
<ul>
<li><strong>cache_lifetime </strong>: Durée de vie du cache (en secondes) -&gt; par défaut il est à 7200 s</li>
<li><strong>cache_tags </strong>: Type de bloc mis en cache</li>
<li><strong>cache_key </strong>: Identifiant de l’ information qui est mise en cache</li>
</ul>
<p><em>protected function _construct()</em></p>
<p><em>{</em></p>
<p><em> $this-&gt;addData(array(</em></p>
<p><em> </em><span style="white-space: pre;"><em> </em></span><em>&#8216;cache_lifetime&#8217; =&gt; 3600,</em></p>
<p><em> </em><span style="white-space: pre;"><em> </em></span><em>&#8216;cache_tags&#8217;    =&gt; array(Mage_Catalog_Model_Product::CACHE_TAG),</em></p>
<p><em> </em><span style="white-space: pre;"><em> </em></span><em>&#8216;cache_key&#8217;     =&gt; $this-&gt;getProduct()-&gt;getId()));</em></p>
<p><em>}</em></p>
<p>Dans cet exemple, nous voulons réécrire le bloc Mage_Catalog_Model_Product:</p>
<p>”<em>&#8216;cache_lifetime&#8217; =&gt; 3600</em>” concerne la durée de mise en cache de l’information (soit 3600 secondes).</p>
<p>”<em>&#8216;cache_tags&#8217;    =&gt; array(Mage_Catalog_Model_Product::CACHE_TAG) </em>” concerne l’action qui va déclencher le rafraichissement des données (affichage d’une liste de produits).</p>
<p>”&#8217;<em>cache_key&#8217;     =&gt; $this-&gt;getProduct()-&gt;getId()))</em>;” est l’identifiant du produit qui va être recalculé une fois le temps de mise en cache écoulé et l’action (cache_tags) de nouveau enclenchée.</p>
<p>- La plupart du temps la redéfinition du constructeur n’est pas suffisante, il est donc nécessaire de définir les fonctions séparément, elles feront toutes appel à la classe parent Mage_Core_Block_Abstract-&gt; toHtml().</p>
<p class="wp-caption-dd"><em>public function getCacheKey(){}</em></p>
<p class="wp-caption-dd"><em>public function getCacheLifetime(){}</em></p>
<p class="wp-caption-dd"><em>public function getCacheTags(){}</em></p>
<p>À noter qu’il est également possible d’installer certaines extensions qui mettent en place ces caches comme le <a title="Cache pour les catégories" href="http://www.magentocommerce.com/magento-connect/paulborsky/extension/3971/paulborsky_categorycache" target="_blank">cache pour les catégories</a> ou le <a title="Cache pour les produits" href="http://www.magentocommerce.com/magento-connect/netresearch/extension/2138/catalogcache" target="_blank">cache pour les produits</a>. Il est cependant conseillé de les utiliser avec prudence car elles peuvent ne pas apporter entière satisfaction et provoquer plusieurs erreurs au cours de leur installation.</p>
<p class="wp-caption">Optimisation du cache</p>
<p>Par défaut, Magento stocke les données propres au cache et aux sessions sur la même partition que le reste des fichiers, donc dans la majorité des cas, sur le disque dur (file system).</p>
<p>Pour optimiser la rapidité d&#8217;accès aux fichiers, il est possible de créer une partition RAM, par exemple via Memcached, et y monter les dossiers <em>racine_magento/var/cache</em> et <em>racine_magento/var/session</em>.</p>
<p>Pour activer Memcached dans Magento, il faut ajouter le bloc de code suivant dans le fichier de configuration: <em>/app/etc/local.xml</em> :</p>
<p><em>&lt;cache&gt;</em></p>
<p><em>&lt;backend&gt;memcached&lt;/backend&gt;&lt;!&#8211; apc / memcached / empty=file &#8211;&gt;</em></p>
<p><em>&lt;memcached&gt;&lt;!&#8211; memcached cache backend related config &#8211;&gt;</em></p>
<p><em>&lt;servers&gt;&lt;!&#8211; any number of server nodes can be included &#8211;&gt;</em></p>
<p><em>&lt;server&gt;</em></p>
<p><em>&lt;host&gt;&lt;![CDATA[127.0.0.1]]&gt;&lt;/host&gt;</em></p>
<p><em>&lt;port&gt;&lt;![CDATA[11211]]&gt;&lt;/port&gt;</em></p>
<p><em>&lt;persistent&gt;&lt;![CDATA[1]]&gt;&lt;/persistent&gt;</em></p>
<p><em>&lt;/server&gt;</em></p>
<p><em>&lt;/servers&gt;</em></p>
<p><em>&lt;compression&gt;&lt;![CDATA[0]]&gt;&lt;/compression&gt;</em></p>
<p><em>&lt;cache_dir&gt;&lt;![CDATA[]]&gt;&lt;/cache_dir&gt;</em></p>
<p><em>&lt;hashed_directory_level&gt;&lt;![CDATA[]]&gt;&lt;/hashed_directory_level&gt;</em></p>
<p><em>&lt;hashed_directory_umask&gt;&lt;![CDATA[]]&gt;&lt;/hashed_directory_umask&gt;</em></p>
<p><em>&lt;file_name_prefix&gt;&lt;![CDATA[]]&gt;&lt;/file_name_prefix&gt;</em></p>
<p><em>&lt;/memcached&gt;</em></p>
<p><em>&lt;/cache&gt;</em></p>
<p>Attention! Il faut s&#8217;assurer que les variables « host » (ici : 127.0.0.1) et « port » (ici : 11211) soient correctes.  Une fois le fichier sauvegardé, les nouveaux paramètres sont tout de suite actifs.</p>
<p><strong>Il existe de nombreuses solutions pour optimiser l’affichage d’un site. Une bonne gestion du cache est l&#8217;une d&#8217;entre elles. Magento met  à disposition des développeurs une large palette de fonctions qui leur permet d&#8217;adapter le code de façon optimum pour chacun de leurs besoins.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bysoft.fr/blog/php/le-cache-de-magento/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Etude de cas : Un webservice de regroupement produit simple/produit configurable dans Magento</title>
		<link>http://www.bysoft.fr/blog/internet/etude-de-cas-un-webservice-de-regroupement-produit-simpleproduit-configurable-dans-magento/</link>
		<comments>http://www.bysoft.fr/blog/internet/etude-de-cas-un-webservice-de-regroupement-produit-simpleproduit-configurable-dans-magento/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 13:37:02 +0000</pubDate>
		<dc:creator>gregoire</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bysoft.fr/blog/?p=358</guid>
		<description><![CDATA[Magento propose, dès la version communautaire, une API Webservice SOAP et XML-RPC permettant d’échanger simplement des informations avec la base de données. Il est donc possible, via une série de méthodes prédéfinies (http://www.magentocommerce.com/support/magento_core_api), de récupérer des informations, d’en mettre à jour, d’en envoyer ou d’en supprimer de la base de données, sans avoir à intervenir [...]]]></description>
			<content:encoded><![CDATA[<p>Magento propose, dès la version communautaire, une API Webservice SOAP et XML-RPC permettant d’échanger simplement des informations avec la base de données. Il est donc possible, via une série de méthodes prédéfinies (http://www.magentocommerce.com/support/magento_core_api), de récupérer des informations, d’en mettre à jour, d’en envoyer ou d’en supprimer de la base de données, sans avoir à intervenir dans le code ou dans l’interface d’administration du site Ecommerce.<br />
Cela est très pratique, notamment, pour insérer de nouveaux produits, en mettre à jour les données, mettre à jour ses stocks, créer des expéditions, récupérer des données clients ou commandes, etc…</p>
<p>Néanmoins, les méthodes présentes  par défaut dans l’API Magento ne permettent pas de tout faire, et leur utilisation, dans une démarche organisationnelle d’une société, connaît ainsi certaines limites.<br />
Ainsi, concernant le catalogue produits, il est possible de créer de nouveaux produits, si tant est que l’on reste dans le cadre de produits vendus de manière directe (ce que l’on appelle dans Magento des « produits simples »).<br />
Magento comporte en effet de nombreux types de produits, permettant au marchand d’organiser de manière très souple son catalogue produits :</p>
<ul>
<li>Produits simples</li>
<li>Produits configurables</li>
<li>Produits groupés</li>
<li>Produits téléchargeables</li>
<li>Produits « Bundles »</li>
<li>Produits virtuels</li>
</ul>
<p>Grâce aux produits « configurables », le marchand est donc capable de proposer sur son site une unique fiche produit pour un article déclinable en plusieurs combinaisons.</p>
<p>C’est typiquement le cas d’un t-shirt disponible en plusieurs tailles et plusieurs coloris.<br />
Prenons un exemple concret, pour un t-shirt disponible :</p>
<ul>
<li>En tailles L, XL et XXL</li>
<li>En coloris Rouge, Jaune et violet</li>
</ul>
<p>Du point de vue logistique, le marchand possède un stock de produits relatif à chaque combinaison de valeurs, et donc à chaque référence produit distincte. Il a donc un stock donné pour son t-shirt Rouge taille L, un stock pour le Rouge taille XL, un stock pour le Rouge taille XXL, un stock pour le Jaune taille L, etc…</p>
<p>Dans Magento, pour qu’un produit ait un stock spécifique, il doit avoir une référence spécifique, et doit être un « produit simple ».<br />
On aura donc 6 produits simples dans Magento :</p>
<ul>
<li>Rouge / taille L</li>
<li>Rouge / taille XL</li>
<li>Rouge / taille XXL</li>
<li>Jaune / taille L</li>
<li>Jaune / taille XL</li>
<li>Jaune / taille XXL</li>
</ul>
<p>Le marchand ne souhaite pas afficher chaque combinaison de valeurs sur le site (ce qui reviendrait dans notre cas à afficher 6 fiches produits différentes sur le site, pour en fait un même produit, pour lequel seules la taille et la couleur changent&#8230;).<br />
Il va donc créer un produit dit « configurable » qui sera le seul affiché sur le site, et qui présentera deux listes déroulantes : l’une pour choisir la taille et l’autre pour choisir la couleur. Pour cela, il crée son produit configurable en BackOffice de Magento, et y rattache les 6 produits simples correspondant aux 6 déclinaisons possibles du produit.</p>
<p><img class="aligncenter size-full wp-image-360" title="Tshirts - Configurable in Magento" src="http://www.bysoft.fr/blog/wp-content/uploads/2010/09/Tshirts2.jpg" alt="Tshirts - Configurable in Magento" width="650" height="424" /></p>
<p>Revenons-en à notre API :<br />
Il est possible, via l’API Magento, de créer ces types de produits, à savoir les produits simples et le produit configurable. Ce qu’il n’est pas possible de faire, c’est de regrouper les produits simples au sein du produit configurable, de sorte que l’on ne peut pas mettre en place (avec l’API standard) des scripts automatiques entre un ERP et Magento qui s’affranchiraient de toute manipulation sur le BackOffice pour regrouper les produits.<br />
Dans le cadre d’un projet pour l’un de nos clients, nous avons ainsi créé une nouvelle méthode que nous avons intégrée à l’API Magento, permettant de faire ce regroupement de produits simples et configurables.</p>
<p>En voici les spécifications :</p>
<p><strong>Objectif</strong><br />
L’objectif est de créer un nouvel outil Webservice permettant de regrouper facilement des produits simples au sein d’un produit configurable. Cette fonctionnalité n’existe pas en standard sur Magento 1.4.0.1.</p>
<p><strong>Description technique</strong><br />
<em><strong> Pré-requis</strong></em><br />
Pour que la méthode webservice puisse être appelée, les pré-requis suivants doivent être respectés :</p>
<ul>
<li>Le produit configurable doit déjà exister (mais sans avoir obligatoirement de produit simple qui lui est relié), dont l’attribut de regroupement est initialisé ou non.</li>
<li>Le(s) produit(s) simple(s) que l’on souhaite rattacher au produit configurable doi(ven)t déjà exister</li>
</ul>
<p><strong>Paramètres du webservice</strong></p>
<p>Les paramètres à passer à la nouvelle méthode webservice seront les suivants :</p>
<ul>
<li>SKU du produit configurable existant</li>
<li>SKU du produit simple existant</li>
<li>Prix spécifique à appliquer (optionnel)</li>
<li>Règle d’application du prix spécifique (optionnel mais obligatoire si un prix spécifique doit être appliqué)</li>
</ul>
<p>- « POURCENT » (pourcentage du prix de base)<br />
- « EURO » (nouveau montant en euros)<br />
- Vide si aucun prix n’a été saisi précédemment</p>
<ul>
<li>Attribut configurable</li>
</ul>
<p><strong> Format du webservice</strong><br />
Le webservice suivra le format ci-dessous :<br />
Nom de méthode : catalog_product.assignConfigurable<br />
Retour : Codes de retour suivant résultat<br />
Arguments :</p>
<ul>
<li>Chaîne de caractères : SKU Produit configurable</li>
<li>Chaîne de caractères : SKU Produit simple</li>
<li>Valeur décimale : Prix à appliquer</li>
<li>Chaîne de caractères : Valeur prédéfinie parmi « POURCENT » ou « EURO »</li>
<li>Attribut configurable</li>
</ul>
<p><strong> Exemples d’appels</strong><br />
<em><strong> Avec prix applicable directement</strong></em><br />
$proxy-&gt; catalogProductAssignConfigurable(‘sessionId’, ‘skuConfigurable’, ‘skuSimple’, 12.90, ‘EURO’, ‘attribut’);<br />
<em><strong> Avec prix applicable en pourcentage</strong></em><br />
$proxy-&gt; catalogProductAssignConfigurable(‘sessionId’, ‘skuConfigurable’, ‘skuSimple’, 20, ‘POURCENT’, ‘attribut’);<br />
<em><strong> Sans prix spécifique</strong></em><br />
$proxy-&gt; catalogProductAssignConfigurable(‘sessionId’, ‘skuConfigurable’, ‘skuSimple’,,, ‘attribut’);<br />
<em><strong> </strong></em></p>
<p><em><strong>Codes retour</strong></em><br />
Suivant le résultat de l’action de rattachement du produit simple au produit configurable, plusieurs codes peuvent être retournés :</p>
<table border="1">
<tbody>
<tr>
<td style="text-align: center;"><strong>Résultat</strong></td>
<td style="text-align: center;"><strong>Code Retour</strong></td>
<td style="text-align: center;"><strong>Retour du Webservice</strong></td>
</tr>
<tr>
<td>Succès</td>
<td style="text-align: center; ">1</td>
<td>success</td>
</tr>
<tr>
<td>Produit configurable non trouvé</td>
<td style="text-align: center;">2</td>
<td>SKU du produit configurable</td>
</tr>
<tr>
<td>Produit simple non trouvé</td>
<td style="text-align: center;">3</td>
<td>SKU du produit simple</td>
</tr>
<tr>
<td>Règle d’application du prix non reconnue</td>
<td style="text-align: center;">4</td>
<td>‘POURCENT-EURO-missing’</td>
</tr>
<tr>
<td>Echec pour raison inconnue</td>
<td style="text-align: center;">0</td>
<td>unknown reason</td>
</tr>
<tr>
<td>Attribut configurable non affecté au produit simple</td>
<td style="text-align: center;">5</td>
<td>Super attribute [Code de l'attribut] not in simple product [SKU du produit simple]</td>
</tr>
<tr>
<td>Un autre attribut configurable est déjà affecté au produit Configurable</td>
<td style="text-align: center;">6</td>
<td>Super attribute [Code de l'attribut] already affected to [SKU du produit configurable]</td>
</tr>
<tr>
<td>Un autre produit simple est déjà affecté au produit configurable avec les mêmes valeurs d’attributs</td>
<td style="text-align: center;">7</td>
<td>Product([SKU du produit simple similaire]) with this combination of attributes already associated to configurable.</td>
</tr>
</tbody>
</table>
<p><strong><em>Spécificités</em></strong><br />
Le webservice sera développé pour la V2 de l’API Magento, sur la version 1.4.0.1 de Magento. La nouvelle méthode Webservice sera donc intégrée au document WSDL de l’API :<br />
http://www.nomdusite.com/index.php/api/v2_soap/index?wsdl</p>
<p>Les produits configurables initialisés sont créés via l’API Magento et l’(les)attribut(s) de regroupement n’est (ne sont) pas forcément initialisé(s). Le webservice devra donc détecter cela et, si l’attribut n’est effectivement pas initialisé, l’initialiser avec l’(les)attribut(s) donné(s) en paramètre(s). Si le produit configurable est déjà initialisé avec un autre attribut, le webservice retournera une erreur (voir tableau ci-dessus – code retour 6) et l’appel webservice sera ignoré (le webservice ne modifie pas un attribut de regroupement déjà initialisé, il initialise seulement l’attribut au niveau du produit configurable s’il ne l’est pas déjà.</p>
<p>Le webservice vérifie déjà si les attributs de regroupement sont initialisés. Si ce n’est pas le cas, il les initialise avec les attributs passés en paramètre. Ensuite, il lie le produit simple au produit configurable.<br />
Ce type de méthode en webservice peut être également utile dans le cadre des autres produits Magento, notamment les « produits groupés » ou les « produits Bundle ».</p>
<p>Toutes les principales fonctions existent dans Magento. Par exemple, la fonction d’assignation d’un produit simple à un produit configurable est la fonction suivante :<br />
$productConfigurable-&gt;setConfigurableAttributesData($dataAttributes)<br />
Il a donc fallu construire le tableau de « super-attribut » $dataAttributes et créer une méthode dans l’API Magento.<br />
Le module est compatible avec Magento 1.4.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bysoft.fr/blog/internet/etude-de-cas-un-webservice-de-regroupement-produit-simpleproduit-configurable-dans-magento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Phing</title>
		<link>http://www.bysoft.fr/blog/internet/phing/</link>
		<comments>http://www.bysoft.fr/blog/internet/phing/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 15:01:15 +0000</pubDate>
		<dc:creator>cyrildrouin</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bysoft.fr/blog/?p=325</guid>
		<description><![CDATA[Présentation
Principe
Phing (Phing Is Not Gnu make) est un outil de déploiement permettant d’automatiser une suite d’opérations. Il est comparable à Make (généralement utilisé pour les développements en C et C++) et Ant (le plus souvent utilisé dans le cadre de développements en Java). Comme ces deux outils, il permet de définir une série de tâches [...]]]></description>
			<content:encoded><![CDATA[<h2>Présentation</h2>
<h4>Principe</h4>
<p>Phing (<strong>Ph</strong>ing<strong> I</strong>s <strong>N</strong>ot <strong>G</strong>nu make) est un outil de déploiement permettant d’automatiser une suite d’opérations. Il est comparable à Make (généralement utilisé pour les développements en C et C++) et Ant (le plus souvent utilisé dans le cadre de développements en Java). Comme ces deux outils, il permet de définir une série de tâches à accomplir et des dépendances entre ces tâches. Sur beaucoup de points, Phing ressemble à Ant sur lequel il est basé directement.</p>
<p>Phing est un outil programmé entièrement en PHP, développé en open source (Gnu Lesser General Public License). Toute la documentation, et le code source sont disponibles sur le site suivant : <a href="http://www.phing.info/trac/" target="_blank">http://www.phing.info/trac/</a></p>
<h4>Installation</h4>
<p>L’installation de Phing est très aisée, que ce soit sur Linux ou Windows : elle se fait en utilisant le package manage  Pear :</p>
<p class="note">pear channel-discover pear.phing.info<br />
pear install phing/phing-beta</p>
<p>Nous avons également installé l’extension pour utilisation native de SVN :</p>
<p class="note">pear install VersionControl_SVN-0.3.3</p>
<p>Dans notre cas, il a aussi été nécessaire d’installer SSH2, la librairie PHP permettant de se connecter en SSH :</p>
<p class="note">pecl install SSH2-0.11.0</p>
<h4>Utilisation</h4>
<p>Phing est un outil en ligne de commande, qui s’appelle simplement en tapant la commande :</p>
<p class="note">phing</p>
<p>Si l’on veut exécuter une tâche particulière, il suffit de la spécifier de cette façon :</p>
<p class="note">phing &lt;task name&gt;</p>
<h4>Fonctionnement</h4>
<p>Lorsque phing s’exécute, il va chercher le fichier ‘build.xml’ à l’emplacement du dossier courant, et exécute la tâche spécifiée ou la tâche par défaut du fichier.</p>
<p>Le fichier build.xml est un fichier xml de ce type :</p>
<p class="note">&lt;?xml version=&#8221;1.0&#8243;?&gt;<br />
&lt;project name=&#8221;build&#8221; default=&#8221;main&#8221;&gt;<br />
&lt;property value=&#8221;.&#8221; /&gt;<br />
&lt;property value=&#8221;svn&#8221; /&gt;<br />
&lt;target depends=&#8221;update-back&#8221;/&gt;<br />
&lt;target&gt;<br />
&lt;svnupdate<br />
svnpath=&#8221;${svn_path}&#8221;<br />
todir=&#8221;${project_root}&#8221;<br />
nocache=&#8221;true&#8221; /&gt;<br />
&lt;/target&gt;<br />
&lt;/project&gt;</p>
<p>Le tag project définit le projet, la propriété default est le nom de la tâche appelée par défaut.</p>
<p>Les tags ‘property’ correspondent à des variables. La propriété name en est le nom, et value la valeur. Il peut s’agir de chaines de caractères, ou de listes de chaines de caractères séparées par une virgule.</p>
<p>Les tags ‘target’ correspondent à des tâches. La propriété name est le nom d’appel de la tâche. La propriété depends est la liste des autres tâches à exécuter avant la tâche courante. A l’intérieur du tag, les autres tags sont la liste des commandes à exécuter par le script. Pour la tâche update-back par exemple, il s’agit d’un svn update.</p>
<p>Il existe un certain nombre de commande exécutables par défaut :</p>
<p><strong>exec :</strong> exécute une ligne de commande</p>
<p><strong>foreach : </strong>parcours un tableau et pour chaque élément renvoie vers une autre tache avec l’élément en argument</p>
<p>et différentes autres : <strong>chmod, chown, delete, move</strong>, etc. La documentation complète est disponible ici : <a href="http://phing.info/docs/guide/trunk/" target="_blank">http://phing.info/docs/guide/trunk/</a></p>
<h2>Usage sur un projet spécifique PHP/Symfony</h2>
<h4>Choix de Phing</h4>
<p>Phing a été choisi, plutôt que Ant ou Make pour une raison principale : c’est un outil fait en PHP. Cela apporte les gains suivants :</p>
<ul>
<li>Facilité d’utilisation pour une équipe PHP</li>
<li>Pas besoin d’installer Java ou d’autres utilitaires sur nos serveurs</li>
<li>Possibilité d’écrire du code PHP directement dans une tâche si nécessaire</li>
<li>Possibilité d’étendre l’outil en créant de nouvelles tâches en cas de besoin</li>
</ul>
<h4>Tâches disponibles</h4>
<p>Les tâches suivantes on été créées dans le cadre de notre projet. Toutes ont été écrites pour être appelées depuis le serveur de backend. Le fichier build.xml est présent sur le serveur de backend, et est dans svn à la racine de la branche de production.</p>
<p>Celles-ci ont été écrites pour être appelées par des tâches principales, elles ne devraient pas être appelées individuellement :</p>
<p><strong>update-back</strong> : update la copie locale du backend</p>
<p><strong>rollback-back</strong> : revert la copie locale du backend jusqu’à la révision spécifiée</p>
<p><strong>clear-backend-cache</strong> : vide le cache symfony du backend</p>
<p><strong>update-filer</strong> : update la copie locale du filer</p>
<p><strong>rollback-filer</strong> : revert la copie locale du filer jusqu’à la révision spécifiée</p>
<p><strong>clear-frontend-cache </strong>: vide le cache symfony des serveurs frontaux</p>
<p>Celles-ci sont les tâches principales, qui peuvent être appelées directement :</p>
<p><strong>main </strong>: (tâche par défaut), elle appelle update-back, update-filer et clear-backend-cache. Elle permet d’effectuer une livraison sans risque sur les frontaux – mais dont les effets ne pourront peut-être pas être vus immédiatement car les caches ne sont pas vidés.</p>
<p><strong>cc</strong> : elle appelle main et clear-frontend cache. Elle sert à effectuer une livraison avant 9h.</p>
<p><strong>rollback</strong> : elle prend en argument une révision, et appelle les tâches rollback-back, rollback-filer et clear-backend-cache. Elle permet de faire un retour arrière sans risque sur les frontaux – mais dont les effets ne pourront peut-être pas être vus immédiatement car les caches ne sont pas vidés.</p>
<p><strong>rollbackcc</strong> : elle prend en argument une révision, et appelle les tâches rollback et clear-frontend-cache. Elle sert à faire un retour arrière avant 9h.</p>
<h4>Gain par Phing</h4>
<p>Phing a été mis en place il y a une semaine. Les gains déjà visibles sont :</p>
<ul>
<li>Facilité des déploiements, moins fastidieux</li>
<li>Sécurité des déploiements : plus de problème d’oubli d’un update ou d’un vidage de cache</li>
<li>Rapidité des déploiements : 30 secondes d’opération au lieu de plusieurs minutes</li>
<li>Maintien de la simplicité des déploiements en cas d’évolution de l’architecture système (par exemple, lors de l’ajout d’un frontal, il suffit d’ajouter son IP dans la liste des frontaux, et le processus de déploiement reste valide)</li>
</ul>
<h4>Evolutions futures</h4>
<p>Phing est un outil extrêmement flexible, voici quelques évolutions possibles de son utilisation :</p>
<ul>
<li>Passage de tests automatiques dans la foulée du déploiement pour le valider</li>
<li>Automatisation des évolutions de base de données en utilisant les outils symfony appropriés</li>
<li>Validation de l’absence de conflit SVN lors du déploiement</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bysoft.fr/blog/internet/phing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- Check injection [SessionID=6F596C49]-->
