Archives de catégorie : Code

Des astuces de codage et autres éléments dans ce genre

Configuration Nginx php5-fpm pour symfony 2

Bonjour,

Voilà, je me suis pris la tête pour configurer correctement Symfony sur ma machine (ubuntu) pour faire tourner Symfony 2.

Je vais vous donner quelques astuces supplémentaires et quelques exemples de configuration.

Tout d’abord, on va commencer par php5-fpm (fastcgi). Symfony consomme de la mémoire, pas énormément en “prod” par contre en version de développement, ça bouffe pas mal surtout si on veut faire du debug. On va donc commencer par augmenter la quantité de mémoire allouée a FPM.

On va rechercher le fichier php.ini utilisé.

mathieu@mathieu:~/workspace/statis$ locate php.ini
/etc/php5/apache2/php.ini
/etc/php5/cli/php.ini
/etc/php5/fpm/php.ini
mathieu@mathieu:~/workspace/statis$

Dans le cas présent, je sais que j’utilise nginx donc pour l’exécution de PHP, j’utilise “fpm”, c’est donc le fichier que je vais modifier.

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 1024M

Ici, j’ai fixé la limite de mémoire a 1024Mb, on pourrait aussi l’écrire 1G. Une fois ceci fait, on redémarre “fpm” :

root@mathieu:~/workspace/statis# service php5-fpm restart
 * Restarting PHP5 FastCGI Process Manager php5-fpm    [ OK ] 
root@mathieu:~/workspace/statis#

Symfony 2 utilise dans certains cas les entêtes Http pour retransmettre des informations de debug, notamment à l’attention de ChromePHP et FirePHP. Par défaut la transmission en environnement de “Dev” est active. Du coup, nginx sature et renvoie des erreurs 502 parce que les entêtes sont trop “gros”.

Je vous mets ici ma conf actuelle de nginx, que je commenterai par la suite :

server {
    listen 9999;
    server_name symfony2;
    root /home/mathieu/workspace/statis/web;
    error_log /var/log/nginx/statis.error.log warn;
    access_log /var/log/nginx/statis.access.log warn;
    rewrite ^/app\.php/?(.*)$ /$1 permanent;
    location / {
        index app.php;
        try_files $uri @rewriteapp;
    }
    location @rewriteapp {
        rewrite ^(.*)$ /app.php/$1 last;
    }
    location ~ ^/(app|app_dev|config)\.php(/|$) {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO       $path_info;
                fastcgi_read_timeout 600;
                fastcgi_buffer_size   16k;
                fastcgi_buffers       4 16k;  # up to 4k + 128 * 4k
                fastcgi_max_temp_file_size 0;
                fastcgi_index index.php;
                include fastcgi_params;
                gzip off;

    }
}
  • Ligne 1 : on ouvre la configuration du serveur
  • Ligne 2 : on définit le port d’écoute. Ici il s’agit du 9999 mais plus généralement on utilise le port 80 spécifique au protocole http.
  • Ligne 3 : on définit le nom du serveur.
  • Ligne 4 : On définit le répertoire racine de l’application. Attention ici le “Webe est important pour symfony parce qu’il contient le système de boot de symfony.
  • Ligne 5 et 6: On définit les noms des fichiers de log nginx.
  • Ligne 7 : On réécrit l’url pour virer les noms app.php en environnement de production.
  • Ligne 8 à 11: on définit l’index de l’application et on stocke en mémoire.
  • Ligne 12 à 14 : on définit les règles de réécriture avec la variable précédemment enregistrée.
  • Ligne 15 à 26 : Parametres pour l’exécution de Fast-cgi : Je vais revenir dessus plus précisément ci-dessous.

Voilà un exemple de configuration Nginx pour le fonctionnement de Symfony 2, je vais maintenant reprendre la partie FPM pour corriger les problèmes d’entêtes trop importants

location ~ ^/(app|app_dev|config)\.php(/|$) {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO       $path_info;
                fastcgi_read_timeout 600;
                fastcgi_buffer_size   16k;
                fastcgi_buffers       4 16k;  # up to 4k + 128 * 4k
                fastcgi_max_temp_file_size 0;
                fastcgi_index index.php;
                include fastcgi_params;
                gzip off;

    }

Ce qui nous intéresse ici ce sont les ligne 7 et 8, pour redéfinir les tailles des buffers. On les augmente avec les valeurs ci-dessus.

Ce sont les 2 astuces que j’ai repéré pour les configurations des serveurs pour faire fonctionner Symfony 2 avec nginx et phpfpm.

Git : installation d’un repository sur une hébergement mutualisé OVH – Partie 1 : Preparation du repository

Bonjour !

Hier je vous ai parlé de GIT, un système simple de “versioning”. Perso, j’ai certains projets de développement qui m’intéresserait de “versionné”. J’avais essayer Subversion sur un hébergement mutualisé mais comme cela nécessite de pouvoir installer les éléments propres à subversion … j’ai abandonné.

Du coup, après m’être intéressé à git j’ai voulu tenter l’expérience. Après quelques recherches je suis tombé sur plusieurs tutoriel qui expliquait comment le faire. Ceci dit, ces tutoriels n’était à mon gout pas assez clair et documenter. Je ne prétends pas faire mieux mais je vais quand même essayer.

Aujourd’hui, on va donc créer le repository principal de git.

  1. On va donc créer un dossier git dans le répertoire racine pour ne pas interferer avec notre site en lui même.
    mkdir git
  2. Notre répertoire de repository est créé, on va maintenant créer le repository proprement dit en commençant par le répertoire où il sera stocké.
    mkdir monrepo.git
  3. Une fois ce répertoire créé, on va dedans et on initialise la base de données git
    ~/$cd ~/git/monrepo.git
    ~/test.git$ git init-db
    Initialized empty Git repository in ~/test.git/.git/~/test.git$
  4. On as initialisé le repository git. on va maintenant le configurer une petit peu. Il existe quelques instructions a définir: “user.name” qui permet de définir le nom du codeur, “user.email”, qui se passe de commentaire, “color.ui”  permet de faire de la colorisation syntaxique, et enfin “help.autocorrect” qui permet d’executer directement la commande si une seule commande est  trouvée par git.

Bon ben voila le repository de Git est en place. Il ne reste plus qu’à l’utiliser

Git ou le versioning simple !

Bonjour,

On est tous, nous developpeur, à la merci de modifier un fichier et de tout planter ! Seulement voila, après on perd des heures a tout remettre comme avant.

Il existe une solution, je ne dirai pas la solution car en fait il y en as plusieurs :

  • dupliquer son code et faire des sauvegarde a outrance : pratique si on dispose de centaines de GigaOctets à sacrifier …. mouais en fait non …
  • Priez saint linus, patron des codeurs ….. euh les miracles ca existe …mouais en fait non….
  • Utilisez un système de “versioning” qui permet de revenir à tout instant a une version antérieure de notre code …. mouais ….. euh en fait …. OUI !!!!! C’est exactement ce dont j’ai besoin !

Du coup, on appel un ami (google en l’occurence) et on commence à potasser. Plusieurs système existent avec chacun des avantages et des défauts :

  • CVS “l’ancêtre” , fut le premier systeme de versioning à être utiliser.
  • Subversion “l’institution”, successeur de CVS, il permet de gérer les répertoires et dispose de nombreux plugins/applications pour l’intégrer dans vos IDE.
  • Mercurial : nouveau venu sur lequel j’ai de bons échos mais que je n’ai personnellement pas testé.
  • Git : Encore un “nouveau” mais qui fait ses preuves de plus en plus. Il l’avantage contrairement a subversion de pouvoir fonctionner en mode “hors-ligne”.

C’est donc de Git que je vais vous parler un peu plus avant. Avant avec subversion, je n’avais rien compris aux branches etc … avec Git, j’ai tout compris !

Grosso modo, git c’est bien, c’est bon mangez-en !!

Je vous ferai un petit topo sur une install Git  et votre premier dépot !

Mais là, faut encore que je le découvre un peu plus, ceci dit c’est très très prometteur !

Comment se prémunir d’effacer totalement un site … ou la mésaventure d’un clic malheureux !

Voila, il était une fois un développeur qui travaille sous Symfony, Cette informaticien venant de mettre en production une modification a voulu effacer le cache.

Ceci dit sur Symfony, quand on efface le cache via la superbe commande :

./symfony cc

, le site est désactivé pendant un temps plus ou moins long.

Afin d’éviter ce temps d’indisponibilité, on procède de la façon suivante :

  1. on va dans le repertoire du cache, en règle générale :
    /home/user/www/cache
  2. on utilise la commande magique mais à ne pas mettre entre toutes les mains :
    rm -Rf *

Arrive le jour où pas trop bien réveillé, on se trompe de fenêtre et au lieu d’utiliser la formule magique au bon endroit, on le fait dans le répertoire racine du site !

Attention: Ceci est un exemple à ne pas suivre !!! Ne reproduisez pas cette action chez vous !! Sous peine de grave dommages netistiques !!

Bon, on remet le site, on reconfigure le tout, etc ….

Maintenant, réfléchissons à “Comment éviter que cela ne se reproduise ?”, et trouvons un solution.

….

On dirait pas mais je réfléchi …

..

DING !! Ca y est j’ai trouvé !!

Le problème est de s’assurer que dans n’importe quel répertoire ou l’on se trouve, on puisse effectuer un effacement du cache en étant dans le bon répertoire !!

La solution un simple alias ou une commande bash pour le faire :

  • En alias, éditer le fichieir .bashrc et ajouter en fin de ficheir la ligne suivante  :
    alias viderCache='rm -Rf /home/user/www/cache/*'

    Ensuite on execute la commande : ‘. .bashrc’ pour recharger les alias.

  • Via un script bash, on edite le fichier ‘viderCache’ et on y met le code suivant :
    #!/bin/bash
    rm -Rf /home/user/www/cache/*

Et hop le tour est joué, on ne risque plus de supprimer le fruit de 4 ans de travail en une demi-seconde d’inattention !!

Cette astuce est déclinable dans bien des cas, et notamment pour les taches répétitives !!

Je vous souhaite que la mésaventure de ce pauvre développeur vous serve.

Les boutons sociaux

Les réseaux sociaux prennent de plus en plus d’ampleur de nos jours. Les nouveaux algorithmes de Google les prennent de plus en plus en compte. Il devient important pour le référencement naturel de parler de nous sur ces nouveaux vecteurs de communications.

Voici quelques exemples de codes pour insérer les différents boutons :

  • Facebook :
    <!-- Inclusion pour facebook -->
    <div id="fb-root"></div>
    <script>
    (function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/fr_FR/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));</script>
    
    <div data-href="URL_A_RECOMMANDER" data-send="true" data-layout="button_count" data-width="450" data-show-faces="false" data-action="recommend" data-font="arial" data-ref="fblikeButton"></div>
  • Pinterest :
    <script type="text/javascript" src="//assets.pinterest.com/js/pinit.js"></script>
    
    <a href="http://pinterest.com/pin/create/button/?url=URL_A_RECOMMANDER_ENCODEE&media=URL_A_RECOMMANDER_ENCODEE&description=DESCRIPTION_ENCODEE" count-layout="none"><img border="0" src="//assets.pinterest.com/images/PinExt.png" title="Pin It" style="vertical-align: top;margin:none;"/></a>
  • Twitter : 
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
    
    <a href="https://twitter.com/share" data-via="TWITTER_USER" data-lang="fr" data-related="TWITTER_RELATED" data-hashtags="TWITTER_HASHTAG">Tweeter</a>

Je modifierai ce post au fur et à mesure que le nombre de boutons sociaux intéressants augmentera.