Archives de catégorie : PHP

En php

Faire une redirection 301 en symfony 1

Comment faire une redirection 301 ?

Etape 1 : Créer l’action de redirection

L’idée est de passer par une petite action qui se chargera de renvoyer un entête HTTP avec le code 301 et d’effectuer ensuite la redirection vers la page voulue.

Pour ce faire,  dans le fichier « MonProjet -> apps -> MonApplication -> modules -> seo -> actions -> actions.class.php » (cf arborescence ci-dessous), nous allons créer l’action « redirection ».

L'arborescence d'un projet symfony avec les 2 fichiers que nous allons utiliser.
L’arborescence d’un projet symfony avec les 2 fichiers que nous allons utiliser.

Voici le code à insérer pour  effectuer la redirection.

<?php

/**
 * SEO actions.
 *
 * @package    Nom de l'application
 * @subpackage Nom du module
 * @author     Votre nom ICI
 */
class seoActions extends sfActions
{
  /**
   * Executes index action
   *
   * @param sfRequest $request A request object
   *
   */
  public function executeRedirection(sfWebRequest $request)
  {
    $newRouteName = $this->getRequestParameter('newRoute');
    $myPatternRouting = $this->getContext()->getRouting();

    $parameters = $request->getRequestParameters();
    $status = $parameters['status'];
    unset($parameters['_sf_route']);
    unset($parameters['newRoute']);
    unset($parameters['status']);
    
    $this->redirect($myPatternRouting->generate($newRouteName, $parameters), $status);
  }
}

?>

Le principe est d’appeler cette action avec une certains nombre de paramètres dont :

  • La route vers laquelle on redirige « newRoute ».
  • Le status HTTP à renvoyer (dans notre cas « 301 ».

La fonction se charger ensuite de rediriger le navigateur via la dernière ligne « $this->redirect(…) ».

La méthode est simple et peut être adaptée pour d’autres usages.

Etape 2 : modifier le fichier de routing.

Maintenant que nous avons l’outil, il faut l’utiliser. Nous allons donc modifier le fichier de routing en conséquence.

route1:
  url: /MaNouvelleUrl.html
  param: { module: monmodule, action: monaction}

route1_redirect:
  url: /monAncienneUrl.html
  param: {module: default, action: redirectOldUrl, newRoute: 'route1', status: 301}

Alors la attention il y a une astuce ! en effet quand on developpe une application, on est souvent amener à utiliser les routes à plusieurs endroits dans son code. Si on change simplement la route, on risque d’avoir des conflits. L’astuce est donc de créer une nouvelle route « _redirect » par exemple, qui va répondre sur l’ancienne url. Cette nouvelle route va renvoyer vers notre action « seo/redirection » avec comme paramètre le nom de l’ancienne route.

Ensuite, on modifie notre ancienne route pour qu’elle réponde a la nouvelle url.

On sauvegarde, on déploie, on vide les caches et le tour est joué

Bon c’est pas grand-chose mais ca permet de gérer proprement les redirections 301, 302, etc ….

La CNIL et les cookies – Un petit tutoriel pour implémenter le fameux bandeau sur votre WordPress

Bonjour les gens,

Depuis le mois de décembre 2013, vous pouvez voir fleurir sur vos sites préférés des bandeaux vous informant que les dits sites utilisent des cookies à des fins publicitaireset de mesure d’audience.

Ces bandeaux apparaissent en réponse à la transposition de la directive européenne. Voila maintenant il faut distinguer 3 types de cookies qui nécéssitent la mise en place d’un tel bandeau :

  • Les cookies de mesure d’audience : Ce sont les cookies déposés par notre fameux google analytics.
  • Les cookies à des fins publicitaires : Criteo, tradedoubler et autres régies publicitaires.
  • Les cookies des réseaux sociaux  : facebook; et consorts.

Dans ce tutoriel, je vais juste reprendre la gestion pour les cookies dits de mesure d’audience, notamment en ce qui concerne google analytics. J’ai exploité pour cela les recommendations de la CNIL que vous pourrez égalemen retrouver ici

On va procéder en 2 étapes, tout d’abord nous allons créer un fichier javascript dans le thème et ensuite nous allons l’ajouter au chargement de la page.

Alors commencons par récuperer le contenu du fichier cookies.js

// Remplacez la valeur UA-XXXXXX-Y par l'identifiant analytics de votre site.
gaProperty = 'UA-XXXXXX-Y'

// Désactive le tracking si le cookie d’Opt-out existe déjà.

var disableStr = 'ga-disable-' + gaProperty;

if (document.cookie.indexOf('hasConsent=false') > -1) {
window[disableStr] = true;
}
//Cette fonction retourne la date d’expiration du cookie de consentement 

function getCookieExpireDate() {
 var cookieTimeout = 34214400000;// Le nombre de millisecondes que font 13 mois 
 var date = new Date();
date.setTime(date.getTime()+cookieTimeout);
var expires = "; expires="+date.toGMTString();
return expires;
}

// Cette fonction est appelée pour afficher la demande de consentement
function askConsent(){
    var bodytag = document.getElementsByTagName('body')[0];
    var div = document.createElement('div');
    div.setAttribute('id','cookie-banner');
    div.setAttribute('width','70%');
    // Le code HTML de la demande de consentement
    // Vous pouvez modifier le contenu ainsi que le style
    div.innerHTML =  '<div style="background-color:#000000;color:#FFFFFF"> Ce site utilise des cookies pour mesurer son audience. En naviguant sur ce site, vous en accepter l`utilisation. Pour vous y opposer en suivant c\'est <a href="javascript:gaOptout()" style="color:white;text-decoration:underline;">lien</a>.</div>';
    bodytag.insertBefore(div,bodytag.firstChild); // Ajoute la bannière juste au début de la page 
    document.getElementsByTagName('body')[0].className+=' cookiebanner';
}


// Retourne la chaine de caractère correspondant à nom=valeur
function getCookie(NomDuCookie)  {
    if (document.cookie.length > 0) {
        begin = document.cookie.indexOf(NomDuCookie+"=");
        if (begin != -1)  {
            begin += NomDuCookie.length+1;
            end = document.cookie.indexOf(";", begin);
            if (end == -1) end = document.cookie.length;
            return unescape(document.cookie.substring(begin, end));
        }
     }
    return null;
}

// Fonction d'effacement des cookies   
function delCookie(name )   {
    path = ";path=" + "/";
    domain = ";domain=" + "."+document.location.hostname;
    var expiration = "Thu, 01-Jan-1970 00:00:01 GMT";
    document.cookie = name + "=" + path + domain + ";expires=" + expiration;
}
// Efface tous les types de cookies utilisés par Google Analytics    
function deleteAnalyticsCookies() {
    var cookieNames = ["__utma","__utmb","__utmc","__utmz","_ga"]
    for (var i=0; i<cookieNames.length; i++)
        delCookie(cookieNames[i])
}

// La fonction d'opt-out   
function gaOptout() {
    document.cookie = disableStr + '=true;'+ getCookieExpireDate() +' ; path=/';
    document.cookie = 'hasConsent=false;'+ getCookieExpireDate() +' ; path=/';
    var div = document.getElementById('cookie-banner');
    // Ci dessous le code de la bannière affichée une fois que l'utilisateur s'est opposé au dépôt
    // Vous pouvez modifier le contenu et le style
    if ( div!= null ) div.innerHTML = '<div style="background-color:#000000;color:#FFF"> Vous vous êtes opposé \
    au dépôt de cookies de mesures d\'audience dans votre navigateur.<br/>Pour accepter le depot des cookies, il vous suffit de supprimer les cookies du domaine \'www.domain.tld\' </div>'
    window[disableStr] = true;
    deleteAnalyticsCookies();
}



//Ce bout de code vérifie que le consentement n'a pas déjà été obtenu avant d'afficher
// la baniére
var consentCookie =  getCookie('hasConsent');
if (!consentCookie) {//L'utilisateur n'a pas encore de cookie de consentement
 var referrer_host = document.referrer.split('/')[2];
   if ( referrer_host != document.location.hostname ) { //si il vient d'un autre site
   //on désactive le tracking et on affiche la demande de consentement            
     window[disableStr] = true;
     window[disableStr] = true;
     window.onload = askConsent;
   } else { //sinon on lui dépose un cookie 
      document.cookie = 'hasConsent=true; '+ getCookieExpireDate() +' ; path=/';
   }
}

Copiez ce code, collez dans un fichier « cookies.js » que vous déposerez dans le dossier js de votre thème

www/wp-content/themes/mon-theme/js/cookies.js

Ensuite, nous allons ajouter ce ficher js au chargement de toutes les pages, pour cela nous allons modifier le fichier « header.php » de votre thème.

Ajoutez la ligne suivante dans le fichier :

 <script src="<?php echo get_template_directory_uri(); ?>/js/cookies.js"></script>

Voila, sauvegardez votre fichier, et si vous avez deja inscrit le tag G.A., vous n’avez rien d’autre a faire.

Pour tester votre bandeau, vous pouvez accèder à votre site en utilisant la navigation privée.

A bientot !!

Quelques astuces en PHP

Bonjour,

Je suis tombé sur un blog avec notamment quelques petites astuces de code PHP pas forcément inintéressantes. Du coup je souhaite vous en faire profiter aussi.

Tout d’abord rendons à César ce qui appartient à César, le billet du blog concerné est disponible ici.

Voici parmi les astuces  vues celles qui me semble notable :

  • Lister les noms de fichiers d’un repertoire : Plutôt que d’utiliser la duo classique opendir/readdir, un simple scandir permet de recuperer les noms des fichiers :
    <?php
    var_dump(scandir('.'));
    ?>
    php test.php 
    array(3) {
    [0]=>
    string(1) "."
    [1]=>
    string(2) ".."
    [3]=>
    string(8) "test.php"
    }
  • Créer des variables dynamiquement
    <?php 
    $nomVariable = "idleman";
    $$nomVariable = "is so lazy…";
    echo $idleman
    //résultat : "is so lazy…";
    ?>
  • L’opérateur « Elvis »  assigne une valeur a une autre si la valuer initiale est nulle.
    foo = foo ?: bar;

Voila les astuces que j’ai repérer (parce que je ne les connaissais pas) et qui me seront utiles à l’avenir.

Si j’en trouvent d’autres je les mettrais à la suite.

En espérant que ca vous aide aussi.

Symfony 2 : erreur 502 sur le profiler.

Bonjour,

J’ai installer Symfony2 pour une petite application « perso » et je me suis rendu compte que la barre de debug de Symfony renvoyait systématiquement sur une erreur 502.

Cela vient du fait que les entêtes http sont trop importants parce que par défaut Symfony 2 envoie des informations de debug pour des plugins FirePHP et ChromePHP.

On peut très simplement les désactiver dans le fichier de configuration app/config/config_dev.yml

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
#        firephp:
#            type:  firephp
#            level: info
        #chromephp:
         #   type:  chromephp
          #  level: info

En commentant les lignes 7 à 12, on désactive l’envoi des informations de debug dans les entêtes, réactivant ainsi l’utilisation des barres de debug « en ligne » de Symfony 2.

Voila, pensez juste à vider le cache par sécurité.

php app/console cache:clear

Yapluka !!

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.