• Ce blog — désormais archivé — est en lecture seule.
    Nouveau blog: William Durand.

#forumPHP : résumé de ma première journée

Première journée passée à la Cité des Sciences à Paris à l’occasion du Forum PHP organisé par  l’AFUP. Excellent moment, plein de cadeaux, de têtes plus ou moins connues (que je n’ai pas trop osé aborder d’ailleurs…) et bien sûr d’excellentes conférences. Voici le résumé de ma journée, livré brute (ou presque :-) ).

Rasmus Ledorf

Première conférence du créateur de PHP. Après quelques minutes de galère pour projeter sa présentation, Rasmus a présenté la création puis l’évolution de PHP. Ce que l’on doit retenir : « PHP isn’t cool but what we can do with is » et « i don’t have a cell phone ». Voilà, vous savez tout.

Industrialisation PHP par Canal+

Présenté par Raphaël Carles

Canal+ gère une affluence d’environ 700000+ visites par jour (en pic). Leurs développements s’appuient sur Symfony, ezPublish, Zend et Magento.

Ils virtualisent leurs serveurs web et applications, utilisent des load balancers redondés. Une bonne idée est d’exécuter les batchs sur un serveur virtuel dédié. PHP a été choisi pour sa souplesse en terme de déploiement et de packaging. Leurs exigences sont indépendantes de la technologie employée. Ils ont fait le choix d’utiliser des CMS et solutions PHP pour garantir une maitrise des développements.

Zend Plateform leur permet d’analyser et suivre de manière permanente la santé des sites. Ils ont mis en place des normes d’installation et de configuration des solutions. Ils ont une démarche de capitalisation permanente. Ils ont mis en place des bonnes pratiques au niveau SEO, perfs, navigateurs, développements.

Ils disposent d’un environnements de livraison spécialisés :

- recettes fonctionnelles pour les MOA

- recettes techniques pour intégrateurs et hébergeurs

Chaque commit est constitué d’un patch du code, des commandes SQL, une liste des fichiers modifés et une liste des bugID.

Sans surprise, on retrouve Capistrano au niveau automatisation des déploiements. Ils maitrisent la logistique des déploiements avec des fiches récapitulant des informations telles : planification, horaires automatisés, …

Niveau outils en vrac, ils utilisent : SVN, Zend Studio, Zend Server et Zend FW, UML / Merise.

Ils ont développés un outil de pilotage de SVN (fork de webSVN) et des sources couplé à un serveur de développement centralisé :

- gérer les effets de bord en temps réel

- centralisation des configurations

- verrouillage des sources sur le serveur

Ceci nécessite un développement linéaire. D’autre part, leur outil va générer de la documentation automatiquement. Un autre outil développé concerne le suivi des livraisons (couplé au bug tracking).

Mon avis : Cette présentation n’était pas réellement intéressante. Elle n’apprend rien et l’orateur n’a pas été concluant, il nous tournait le dos… Cependant on voit bien que Canal+ n’est qu’en cours d’industrialisation, il n’y avait pas de retour d’expérience réel et c’est bien dommage.

Propel : apprendre en persistant

Présenté par Arlo Borras

Approche en plusieurs niveau pour appréhender Propel :

Niveau 1 : connaître PDO

Niveau 2 : Faire des objets

ActiveRecord : design pattern permettant à un objet de se gérer (se sauvegarder, se mettre à jour, …)

Encapsulation des requêtes SQL.

PDO doit être aidé pour gérer des éléments NULL : utilisation de l’attribut PARAM_NULL.

Niveau 3 : Ne pas réinventer la roue

Utilisons Propel !

Niveau 4 : Maitriser l’outil

Avantages de Propel :

- PHP5.3 ready (namespaces)

- Connexion implicite à la demande

- Sauvegarde en cascade

- Rapidité :

Avec l’utilisation du design pattern Identity Map = persistance mémoire de ce qui a déjà été demandé.

Et l’utilisation de l’hydratation à la demande via un « formatter » : collection vide, itération hydrate un à un les éléments.

- Validators, Behaviors.

- Gestion de l’héritage : table inheritance : single inheritance (1 table) ou concret inheritance (plusieurs tables)

- Et… Logging, hooks, nested sets, N-N, 1-N, runtime introspection, packages, nested transactions, master/slave, pager, query cache, …

Niveau 5 : dépasser l’outil

Penser aux objets/en objet.

!! Domain-Driven Design !!

L’ORM transforme une BDD en base de d’objets.

Un objet persistant est un objet avant tout.

La persistance d’un objet n’est qu’une caractéristique.

Mon avis : j’attendais cette conférence plus que tout pour rencontrer François Zaninotto, malheureusement il n’a pu venir et Arlo l’a remplacé. Bon tour d’horizon de Propel avec une présentation Prezzi très réussie.

Magento : un framework e-commerce

Par Hubert Desmarest, Guillaume Babik et Roy Rubin (fondateur de Magento)

Trois mots d’ordre pour Magento : Flexibility, scalability, growth

Magento solution c’est :

- Design, development, integration

- Magento eCommerce, Entreprise, Professional & community

- Industry partners

- Hosting environment

- Magento mobile commerce (browser, iPhone app)

- Magento connect / local (extensions market place)

Magento dispose de plus de 3000 extensions. Ecrit en PHP5 en utilisant Zend Framework.

« Upgradeability with customizations : core, local, community » -> Séparation physique des éléments.

« Modularity & flexibility are Key » -> architecture élaborée.

Un point sur l’API « core » :

- Web services : SOAP & XML RPC protocols (catalog, customer, order)

- Tout ce qui est disponible devrait l’être via web services.

- Plusieurs langues, marques sur un système unique à maintenir : Multi-store systems.

Magento au niveau SEO c’est : 100% SE friendly, site map, url rewrites, meta-informations, …

Magento est orienté marketing et dispose d’outils de promotions comme les réductions basées sur des règles.

Au niveau administration : gestion du catalogue, du contenu et également des commandes mais une fonctionnalité étonnante : la possibilité pour l’admin d’ajouter des éléments dans le panier d’un client. On note aussi la présence d’un outil de reporting.

Magento permet les ventes privées en natif, tout comme la navigation mobile.

Avantages de Magento (point de vue intégrateur) :

- modèle très souple

- au service du marketing

- les « multi »

- licence : cout nul ou moindre

- approche logicielle

- solution pérenne

Mais :

- peu documenté

- difficulté d’apprentissage : 4 à 6 mois pour un bon développeur Zend

- modèle de données et applicatif lourd

Mon avis : Magento me semble sexy. Les orateurs n’ont pas caché son côté « usine à gaz » mais je pense qu’il peut valoir le coup, en tout cas, la présentation donnait envie d’essayer :)

Les frameworks, essentiels dans l’écosystème PHP

Par Bastien Jaillot, Xavier Lacot

On attaque avec une réflexion sur les solutions possibles pour réaliser une application web : solutions intégrées ou frameworks.

Considérations :

- complexité

- besoins

- méthodologies

- nouvelles fonctionnalités ? Suppression de fonctionnalités

- Plugins/extensions existent, couvrent les besoins ?

La première conclusion est la suivante : une solution intégrée est souvent une bonne solution car elle a permet de gagner du temps, de l’argent et évite la pression. Une solution intégrée permet de ne pas réinventer la roue. : c’est parfait pour des besoins communs.

Mais pas de besoins communs, alors il faut :

- hacker

- patcher

- extensions : mais pas forcément étendables

- jeter et recoder en utilisant un FW

Donc on recommence et on définit les vrais besoins ! La bonne question c’est : Temps pour bidouiller versus temps pour construire !

On passe ensuite aux critères de choix d’un framework. Les objectifs généraux sont les suivants :

- accélérer les dévs

- simplifier les MAJ et évolutions

- améliorer les perfs

- internationalisation : envisager l’avenir plus sereinement

- améliorer la qualité

- industrialiser la production

- ne plus réinventer la roue

- profiter du travail des autres

Et surtout se faire son idée. Ce n’est donc pas évident. Il faut également prendre en compte un tas de paramètres tels : risques, perfs, sécurité, modèle de conception, outillage, respect des standards, extensibilité, i18n, intégration des briques externes. Il est ensuite démontré que travailler sans framework en entreprise n’est pas simple, voire quasiment pas faisable à cause des méthodes de travail, des procédures diverses, …

Les frameworks offrent la possibilité de faire des tests unitaires, fonctionnels, … Et surtout dispose de métriques ! Ensuite, on a une présentation des différents frameworks : avant, maintenant, bientôt. Les nouvelles tendances sont :

- injection de dépendances

- utilisation des namespaces

- retrait des singletons

- plus légers

En d’autres termes : abandon progressif de la génération actuelle des frameworks. L’avenir se concentre sur les performances.

Enfin, les derniers mots mettent en avant le concept suivant : ne pas javaiser PHP !

Mon avis : Cette présentation donne des billes pour ceux qui pensent encore que les solutions toutes faites sont meilleures quelque soit les problématiques. J’ai bien aimé la présentation et son enchainement.

Optimisations des performances LAMP

Par Cyril Pierre de Geyer et Guillaume Plessis

Premièrement, on doit savoir ce qu’il se passe :

- Logs accès, erreurs

- Xdebug -> profiling

- Requêtes lentes & sans indexes

- Journal des requêtes

Il est conseillé de mettre en place des outils de monitoring :

- Nagios, Zabbix (graphes)

- Cacti, Munin (graphes)

PHP : Pinba (exectime, mémoire, …), Zend Plateform

On doit surveiller :

- OS : CPU, RAM, Réseau

- Apache : disponibilité, requêtes par seconde, temps de réponse

- PHP : Pinba

- MySQL : requêtes par seconde, connexions, innodb_buffer_pool

Après, on va simuler :

  • Tirs de charge

  • Outils : Jmeter, Funkload, Siege, apachebench

Attention à rejouer les tests dans le même contexte : tir de charge de référence.

Ensuite on va analyser :

- Profiling : améliorer les performances

- Détecter les goulots d’étranglement

- Outils : Xdebug, KcacheGrind, webgrind, ZendServer

Et enfin, on va améliorer :

D’abord PHP :

é Opcodes : APC, Xcache, Zend Optimizer

é Script PHP -> Opcode -> Exécution

Puis Apache :

- KeepAlive

- ServerLimit, MaxClients

- MaxRequestsPerChild

- désinstaller les modules non utilisés

- privilégier d’autres serveurs http : Nginx pour le contenu statique

- reverse proxy cache http : varnish

- Compression Gzip/Deflate

- En-têtes Expire

- Etags

Et maintenant, améliorer la base de données :

- Choisir le bon système : Linux 2.6 64bit (60% de perfs en plus face à 2.4)

- Bonne distrib MySQL

- Bon moteur de stockage :

  • MyISAM, InnoDB, HEAP, Archives, …
  • MyISAM : rapide mais ne monte pas en charge, pas transactionnel
  • InnoDB : plugin de MySQL. Plus robuste, transactionnel, …
  • HEAP : en mémoire
  • Archives : informations sans effacement

- Profiling / EXPLAIN

- Optimisation des requêtes et du modèle

- Réplication (maitre/esclave, maitre/maitre)

- Sharding : répartir les données sur différentes grappes de calcul et agréger les résultats.

Mon avis : Excellent ! Je connaissais pas mal de choses sur le sujet mais j’ai appris quelques trucs et astuces qui feront l’objet d’un futur article :)

Introduction au monde No-SQL

Par Damien Tournoud

Plusieurs besoins amènent au monde No-SQL :

- Stocker temporairement ses données : Memcache(d)

- Stocker des données simples : Redis

- Stocker des données structurées : MongoDB, orientée document, non relationnelle, horizontalement scalable par sharding.

En No-SQL on parle de Documents : ce sont des données en Json. On parle également de Collections, des ensemble de Documents.

- Gérer une file d’attente : Beanstalkd (et Pheanstalk pour PHP)

D’autres outils :

- RabbitMQ : implémentation opensource de AMQP.

- Amazon SQS : file d’attente SaaS, API REST

- Indexer en full-text : Apache Solr (basé sur Lucène), Sphinx (écrit en C++)

- Autres (pour les graphes, …) : FlockFlockDB, pas d’intégration facile en PHP, développé par Facebook.

- Bases massivement distribuées éventuellement consistantes : HBase, Cassandra. Le conférencier ne conseille pas d’explorer ces pistes, c’est très compliqué.

Mon avis : Bonne conférence mais pas assez technique. La présentation est bien mais ce fût trop « introduction », ce qui est dommage. Cependant, Damien est sympa, trolleur également mais il a fait une présentation très vivante et très intéressante.

Avis général

Excellentissime ! Des gens cools, des conférences extras, des stands, du café (ahah), … Organisation tip/top, bref rien à dire pour cette première journée.

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz
Publié dans ForumPHP, Ma vie | Mots-clefs : , | Commentaires fermés

#define SOME_NEWS 1

Bonjour, voilà un moment que je n’avais pas écrit, pas mal d’occupations, pas mal de projets et peu de temps pour réfléchir à de nouveaux articles… Article inhabituel donc puisque je vais parlé de mes nouvelles perspectives.

Tout d’abord, mon stage de 2ème année est trouvé, je ne donnerai pas le nom de l’entreprise mais sachez que c’est une grande marque, que ce sera un sujet orienté développement web et industrialisation et que j’ai très hâte de commencer :-D Cependant, le stage débute en avril 2011.

Depuis quelques temps, j’ai décidé de m’orienter sur du développement mobile. J’ai écrit mes premières lignes d’Objective-C il y a quelques jours et j’ai également décroché un projet iPhone avec une entreprise locale. Ceci devrait me permettre d’avancer assez rapidement. Visiblement, le langage n’est pas complexe. Par contre, la gestion d’un projet « mobile » est bien différente de ce que j’ai rencontré jusqu’à présent : faire passer l’ergonomie et l’aisance d’utilisation avant toute fonctionnalité. J’attaque également la programmation Android

Comment écrire un article sans parler de Symfony ? J’ai regardé de près Symfony2, les concepts m’inspirent et je vois une nette ressemblance avec Spring. A première vue, la prise en main est rapide lorsque l’on connait les dogmes Symfony 1.4 et dans mon cas, que l’on connait Java J2EE (Spring notamment).

Doctrine2 lui ressemble à JPA, c’est très agréable. Le système d’annotations est terrible, dommage que la core team PHP rechigne à l’ajouter. Celle-ci ne donne pas très envie de rester développeur PHP… C’est peut-être osé de dire cela mais s’ils restent comme ils sont, PHP pourrait très bien chavirer…

Enfin, Twig, le moteur de templates, est vraiment bien. L’héritage de vue avec la redéfinition de « block » est absolument intuitif et je trouve ça terrible !

J’attends avec impatience la sortie officielle de ce nouveau framework même si je ne suis pas certain de continuer à travailler exclusivement avec Symfony et même PHP…

En effet, j’ai découvert dans un premier temps Play! Framework puis Grails : deux frameworks Java, inspiré de Symfony pour l’un, de Ruby on Rails pour l’autre. Or, Symfony s’inspire déjà de RoR. Après maintes lectures, PHP semble être de plus en plus délaissé au profit de Ruby ou Python. La demande pour ces langages grandit et c’est pourquoi j’ai choisi de me lancer sur Ruby on Rails ou Python. Pour l’instant, mon choix n’est pas fait même si je porte plus Ruby dans mon coeur (allez savoir pourquoi…).

Et le titre de cet article me direz-vous ? Et bien, ces temps-ci et pour des besoins scolaires en recherche opérationnelle, je refais du C++. Même si j’ai un discours très arrêté sur ce langage, je dois dire que j’apprécie. Bon, programmer des heuristiques pour job-shop c’est beaucoup moins drôle mais quand même…

Voilà pour les nouvelles, j’espère ré-écrire bientôt sur des sujets techniques. ;-)

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz
Publié dans Ma vie | Commentaires fermés

symfony rencontre Hudson, Mantis et les autres

Bonjour, depuis un certain temps déjà, je me pose deux questions : « comment améliorer mon travail ? » et… « Comment améliorer mon travail ? ». La première question traite essentiellement de ce que je produis, du code écrit, des fonctionnalités que je mets en place, … tandis que la deuxième question définit mes conditions de travail. Autrement dit, qu’est-ce qui va faire la différence entre tout le monde et moi (jeune entrepreneur) ? Et qu’est-ce qui va me faciliter la vie et ainsi impacter la première question ?

C’est là que les outils que je vais présenter dans cet article interviennent. Aujourd’hui je parlerai de Hudson, Mantis, PhingCheckstyle, PhpDocumentor, Pdepend et je montrerai l’interconnexion de tout ça sur un projet symfony.

Mantis

Mantis est un bug tracker, c’est-à-dire un rapporteur de défaillances. Il permet de consigner tous les problèmes survenus sur une application, de déclarer des priorités plus ou moins importantes mais surtout d’avoir un réel échange entre le rapporteur (le client) et l’équipe technique (composée de… moi). L’avantage d’avoir ce type d’outil dépasse ce que je viens de dire mais je m’en sers essentiellement pour avoir un endroit adapté où récolter les défaillances de mes applications. Mantis s’occupe d’avertir tous les gens concernés par mail, lorsqu’un bug est ajouté ou résolu par exemple. Ainsi, je ne perds aucun retour client auparavant stocké dans ma boîte mail sous forme de dizaines de mails et lorsque je résous un bug, le rapporteur concerné est prévenu automatiquement.

Nous allons voir pourquoi c’est si intéressant.

Hudson

J’ai déjà parlé d’Hudson, sans vraiment rentrer dans les détails parce que je ne vais pas réécrire ce qui a déjà été publié x fois, mais cette fois-ci je vais rentrer plus dans les détails. Au passage, Hudson est un serveur d’intégration continue.

Pour un projet symfony, je crée un projet freestyle, connecté à Git avec un déclencheur sur tout changement dans le repository distant. J’ajoute ensuite une succession de tâches symfony :

- création du répertoire log/

- suppression de la base de tests SQLite

- création de la base de tests

- tests

Ceci est un projet basique qui me permet d’avoir une intégration continue et une alerte rapide par mail si un problème survient.

Oui mais voilà, ce n’est pas suffisant, on peut mieux faire. J’ai parlé de Mantis juste avant, il serait bien de pouvoir connecter Hudson avec Mantis. C’est justement ce que fait le Mantis Plugin pour Hudson. Ainsi, si je « commit » une modification qui a résolue un bug, exemple :

fix issue 0000007

Le plugin va pouvoir lier ce changement avec la page Mantis du bug et ajouter les informations liées au commit. Dorénavant, lorsque je « commiterai » un fix, le rapporteur sera prévenu de la résolution du bug qu’il aura soumis. Le gain de temps est indéniable.

Configuration Hudson :

Mais on peut (encore) faire mieux d’une autre manière, c’est-à-dire que si la build est un succès, pourquoi ne pas la déployer. Pour avoir un changement, je dois faire un « push » vers le repository distant. Or, on ne « push » pas tous les jours ou du moins, pas derrière chaque commit. Ce serait un peu perdre l’avantage du mode décentralisé de Git. Ainsi, quand je choisis de faire un « push » c’est que j’estime avoir suffisamment modifié mon projet. Ceci m’amène à penser qu’il devient intéressant de le déployer.

Merci à Capistrano (lire ici mon article sur le déploiement d’applis symfony et diem avec Capistrano) et au SSH Plugin d’Hudson. Ce plugin n’est pas des plus parfaits mais il fonctionne. Si la build passe, je lance mon déploiement. Normalement, le déploiement n’échoue pas, si c’était le cas alors : capistrano ferait un rollback sur la dernière version fonctionnelle et les logs Hudson m’indiqueraient le problème. Je peux donc être rassuré de ce côté-là.

Jusqu’à présent, je n’ai parlé que d’automatisation des aspects « après développement » à savoir les feedbacks client et le déploiement. Ce sont les deux points essentiels après réussite des tests. Pour autant, Hudson peut aider l’équipe de développeurs en effectuant une série d’analyses.

Phing : l’Ant des temps modernes (ou pas)

Phing, c’est Ant (utilisé dans le monde Java) version PHP, en quelques mots, un outil d’automatisation de tâches répétitives. Il faut connaître Ant pour comprendre qu’il est génial de disposer d’un outil semblable pour PHP. C’est grâce à cet outil que je génère des rapports d’analyse.

Phing s’installe via PEAR.

Checkstyle : mon code a du style !

Checkstyle est un outil de contrôle de code. Il vérifie le style du code écrit (indentation, commentaires, …). Pour l’utiliser avec PHP, il faut PHP_CodeSniffer (on abrège en phpcs) et le Checkstyle Plugin d’Hudson. Pour l’utiliser avec symfony, on ajoutera le standard symfony : http://github.com/denderello/phpcs-symfony ou si vous utilisez la toute dernière version : http://github.com/willdurand/phpcs-symfony.

Configuration Hudson :

Configuration du build.xml (Phing) :

<!-- PHP CodeSniffer -->
<target name="phpcs">
  <echo msg="PHP CodeSniffer..." />
  <exec command="phpcs --standard=Symfony --report=checkstyle ${workspace}/apps ${workspace}/lib/filter ${workspace}/lib/form ${workspace}/lib/model ${workspace}/lib/validator ${workspace}/test" > ${workspace}/log/checkstyle.xml" escape="false"></exec>
</target>

Et aperçu du résultat :

Pdepend : analyse de code statique

Pdepend, analyseur de code statique, permet de calculer des indices (couplage, instabilité, …) afin de déterminer la qualité du code de la build. Pour cela, il nous faut le Jdepend Plugin d’Hudson et avoir installé pdepend.

Configuration Hudson :

Configuration du build.xml :

<!-- PHP dependency checker -->
  <target name="pdepend">
  <echo msg="PHP Depend..." />
  <exec command="pdepend --jdepend-xml=${workspace}/log/jdepend.xml ${workspace}/apps,${workspace}/lib/filter,${workspace}/lib/form,${workspace}/lib/model,${workspace}/lib/validator,${workspace}/test" escape="false" />
</target>

DRY ! Analyser les répétitions de code

Don’t Repeat Yourself, adage symfony, on souhaite ici analyser le code dupliqué. Pour cela, on utilise phpcpd (toujours via PEAR) ainsi que le DRY Plugin d’Hudson.

Configuration Hudson :

Configuration du build.xml :

<!-- PHP copy/paste analysis -->
  <target name="phpcpd">
  <echo msg="PHP Copy/Paste..." />
  <exec command="phpcpd --log-pmd ${workspace}/log/pmd.xml ${workspace}/apps ${workspace}/lib/filter ${workspace}/lib/form ${workspace}/lib/model ${workspace}/lib/validator ${workspace}/test" escape="false" />
</target>

Et aperçu du résultat :

PhpDocumentor : génération de la documentation du projet

PhpDocumentor permet de générer la documentation d’un projet, tout comme Javadoc le ferait. Voici la configuration du build.xml :

<!-- PHP API Documentation -->
<target name="phpdoc">
  <echo msg="PHP Documentor..." />
  <phpdoc title="API Documentation"
   destdir="${workspace}/doc"
   sourcecode="yes"
   defaultpackagename="sfProjetsGagnants"
   output="HTML:Smarty:PHP">
    <fileset dir="./apps">
      <include name="**/*.class.php" />
    </fileset>
    <fileset dir="./lib/model">
      <include name="**/*.class.php" />
      <exclude name="**/Base*" />
    </fileset>
  </phpdoc>
</target>

On pourrait ajouter le DocLinks Plugin pour Hudson afin de lier la documentation générée à chaque build.

Invoquer Phing

Pour invoquer Phing dans Hudson, on peut soit utiliser le plugin qui gère Phing soit utiliser une commande shell. Je préfère la commande shell pour pouvoir passer des paramètres à mon script.

cd $WORKSPACE && phing main -Dworkspace=$WORKSPACE

Couverture de code

Là je vous laisse lire cet article qui explique comment obtenir des rapports de couverture de code symfony dans Hudson.

Conclusion

En plus d’automatiser un certain nombre de tâches, j’obtiens des retours sur mon projet : des retours client grâce à Mantis et des retours sur la qualité de mon travail. Aujourd’hui, des outils pour PHP sont là, il est clair que PHP s’industrialise et grâce à la qualité du framework symfony, il devient intéressant d’adopter les bonnes méthodes et d’utiliser ces outils. PHP, ce n’est plus « Un mini-chat en PHP » par le Site du Zéro.

Il n’est jamais trop tard pour commencer à bien travailler.

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz
Publié dans Boulot, symfony | Mots-clefs : , , , , , , , , , , | Commentaires fermés

Réplication MySQL maître-esclave

Bonjour, je laisse ici une petite note d’un système de secours que j’ai mis en place récemment : la réplication de bases de données MySQL. Il y a beaucoup d’autres articles sur le sujet donc je ne m’y étendrai pas, seul petite différence, j’ai fait la réplication d’une base de prod vers un autre serveur de prod utilisé pour tout à fait autre chose (ie. contenant d’autres bases). C’est l’essentiel de mon article d’aujourd’hui. Je remercie Nicolas Vogel de m’avoir mis sur le bon chemin :-)

La réplication en place me permet de sauvegarder les données contenues de manière instantanée. Si un crash est détecté au niveau du serveur de prod, d’une part il y a fort à parier que, peu voire aucune donnée n’aura été perdue (l’application est déployée sur un serveur unique), et d’autre part, je pourrais lancer un système de secours sur le serveur « esclave« .

Voilà ce qu’il y avait à lire : http://dev.mysql.com/doc/refman/5.0/fr/replication-howto.html

Et pour résumer :

On commence par la partie Maître, c’est-à-dire le serveur de prod numéro 1. On modifie le fichier de configuration /etc/mysql/my.cnf de la manière suivante (on veillera à relancer le service mysql) :

[mysqld]
bind-address  = IP serveur maître
server-id     = 1
log_bin       = /var/log/mysql/mysql-bin.log
# Dans mon cas, c'est la ligne suivante qui spécifie quelle base répliquer
binlog_do_db  = databaseName



Une fois ceci fait on crée un utilisateur « replicateur » pour le deuxième serveur (l’esclave) :

GRANT REPLICATION SLAVE ON *.* TO replicateur@'%' IDENTIFIED BY 'replicateur';

On va devoir s’assurer qu’aucune nouvelle donnée ne soit enregistrée pendant un petit laps de temps. Cette partie est critique puisque il s’agit de bloquer l’écriture sur la base que l’on souhaite répliquer.

FLUSH TABLES WITH READ LOCK;

Il nous faut deux informations que l’on retrouve avec la commande ci-après : la position et le nom du fichier binaire.

SHOW MASTER STATUS;

Pour finir, on fait un dump de la base (mysqldump) et on l’envoie sur le serveur esclave (scp). C’est tout pour le serveur maître, on y reviendra à la fin pour le déverrouiller en écriture.

Au niveau du second serveur, les manip’ sont semblables. On commence par modifier le fichier de conf /etc/mysql/my.cnf puis on redémarre le service mysql.

[mysqld]
server-id       = 2
master-host    = IP serveur maître
master-user     = replicateur
master-password = replicateur
master-port     = 3306
# Je rappelle ici la base à répliquer
replicate-do-db = databaseName

On va ensuite se servir des deux infos relevées plus haut en exécutant la commande :

CHANGE MASTER TO
MASTER_LOG_FILE='FILENAME',
MASTER_LOG_POS=POSITION;

Puis on démarre le process maître/esclave depuis l’esclave :

START SLAVE;

Soit ça marche, soit ça ne marche pas… Par exemple, pour 1 warning détecté, on devra reprendre les paramètres de conf dans une requête de la forme :

CHANGE MASTER TO
MASTER_HOST=IP serveur maître,
MASTER_USER=replicateur,
....;

A partir de là, la replication est prête. Seulement il faut effectuer le rattrapage sur le serveur esclave. La réplication est démarrée mais notre deuxième serveur n’est qu’un esclave qui ne peut recréer la base et se mettre à niveau du maître. Vous comprenez ? Non, tant pis, je recommence. C’est le maître qui donne les ordres donc comme on vient de commencer notre process maître/esclave, le maître ne sait pas que la base de l’esclave est vide. Voilà pour la petite histoire et pourquoi un dump était utile. Il suffit maintenant d’insérer le dump transféré au début.

On retourne sur le serveur maître et on enlève le verrou d’écriture :

UNLOCK TABLES;

La réplication est en place. On peut tester l’ajout d’une ligne dans une table pour voir si la réplication fonctionne parfaitement. Dorénavant, tout changement de la base maître (structures, données) sera répercuté sur la base esclave.

A noter qu’un peu de sécurité ne fait pas de mal. On veillera à créer une liaison très restreinte entre les deux serveurs sur le port 3306, port par défaut de MySQL.

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz
Publié dans Boulot, Serveur, Sysadmin | Mots-clefs : , , , | Commentaires fermés

Création automatique d’un projet symfony + MySQL + Git et Apache2

On ne crée pas de projets symfony tous les jours c’est vrai, mais le processus est souvent le même. En plus de cela, je trouve les manip’ un peu pénible quand il faut toucher à la configuration Apache2. Inspiré de cet article http://www.nacho-martin.com/automating-the-creation-of-new-symfony-1-4-projects-doctrine-git, j’ai écrit ma propre commande incluant la configuration d’un vhost Apache2. Je la partage ici.

Voici donc le script mkSfProject :

#!/bin/bash

SYMFREPO="http://github.com/vjousse/symfony-1.4.git"
DBUSER="us3r"
DBPASS="p4ssw0rd"
VENDOR_DIR="lib/vendor/symfony"
AUTHOR="William DURAND <william .durand1@gmail.com>"
PHP="/usr/bin/php"

if [ -z "$DBPASS" ]; then
 echo edit $0 to add your mysql password on line 4: DBPASS=\"password\"
 exit
fi

if [ -z "$1" ]; then
 echo usage: $0 project_name
 exit
fi

# Create the project directory
mkdir $1
cd $1

git init
git clone $SYMFREPO $VENDOR_DIR
git submodule add $SYMFREPO $VENDOR_DIR/

git submodule foreach 'git submodule init && git submodule update'

git commit -m 'Initial commit; initialized symfony-git (1.4)'

# Generate the project
$PHP $VENDOR_DIR/data/bin/symfony generate:project $1

# Configure the author
$PHP symfony configure:author "$AUTHOR"

# Create the .gitignore file
echo "config/databases.yml" > .gitignore
echo "cache/*" >> .gitignore
echo "log/*" >> .gitignore

# Fix permissions
$PHP symfony project:permissions

# Commit
git add .
git commit -m 'Initialized symfony project'

# Generate a default app and commit
$PHP symfony generate:app frontend
git add .
git commit -m 'Initialized frontend application'

# Create the database and configure it in symfony
mysqladmin -u$DBUSER -p$DBPASS create $1
$PHP symfony configure:database "mysql:dbname=$1;hostname=localhost" $DBUSER $DBPASS

# Create the local URL
URL_PROJECT=`echo "$1.local" | tr '[[:upper:]]' '[[:lower:]]'`

# vhost config
sudo echo "
<virtualhost *:80>
  ServerName $URL_PROJECT

  DocumentRoot \"`pwd`/web\"
  DirectoryIndex index.php

  <directory \"`pwd`\">
    AllowOverride All
    Allow from all
  </directory>

  Alias /sf \"`pwd`/lib/vendor/symfony/data/web/sf\"
  <directory \"`pwd`/lib/vendor/symfony/data/web/sf\">
    AllowOverride All
    Allow from All
  </directory>
</virtualhost>
"
> "/etc/apache2/sites-available/$1"

# Add local url in /etc/hosts
sudo echo "127.0.0.1  $URL_PROJECT" >> /etc/hosts

# Enable the vhost
sudo a2ensite $1

# Reload Apache2
sudo /etc/init.d/apache2 reload

Je lance cette commande et en moins d’une minute, j’ai accès à un projet symfony fonctionnel dans mon navigateur. Voilà :-)

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz
Publié dans Serveur, symfony, Tips | Mots-clefs : , , , | Commentaires fermés