Accueil > Blog > Geek

Un peu de doc sur Symfony2

Symfony2 en pièces détachées


View more presentations from Hugo Hamon.

Symfony2: 30 astuces et bonnes pratiques


View more presentations from Noel Guilbert.

05/08/2011 — Mots-clés : , — Classé dans GeekEcrire un commentaire

Les bundles en Symfony2

Qu’est-ce qu’un bundle ?

Ce n’est pas un plugin, ni un module, ni une application, mais alors, qu’est-ce que c’est ? Je terminerai ce paragraphe quand j’aurai trouvé…

Création d’un bundle

Le bundle se place dans le dossier /src, il faut créer un dossier reprenant le nom de la société (ou du client) et y insérer le dossier du bundle. Par exemple, si je crée le bundle Test pour un client Sylvain, il s’appellera SylvainTestBundle et sera placé dans le répertoire /src/Sylvain/TestBundle.

Il faut un fichier principal pour définir la classe TestBundle dans /src/Sylvain/TestBundle/SylvainTestBundle.php :

<?php

namespace Sylvain\TestBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class SylvainTestBundle extends Bundle
{
}

Ensuite, on crée un controller HelloController dans /src/Sylvain/TestBundle/Controller/HelloController.php :

<?php

namespace Sylvain\TestBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class HelloController extends Controller
{
    public function indexAction()
    {
        return new Response('Hi!');
    }
}

Avec le fichier pour le routing, situé dans /src/Sylvain/TestBundle/Resources/config/routing.yml :

index:
    pattern:    /
    defaults: { _controller: SylvainTestBundle:Hello:index }

Activation d’un bundle

Maintenant, il faut dire à Symfony d’utiliser ce bundle, donc on édite le fichier /app/AppKernel.php et on ajoute une instance du bundle dans le tableau $bundles (méthode registerBundles()) :

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            /* ... */
            new Sylvain\TestBundle\SylvainTestBundle(),
        );

        /* ... */
    }
}

Ne pas oublier d’inclure le routing du bundle dans le routing global du projet, dans le fichier /app/config/routing.yml :

SylvainTestBundle:
    resource: "@SylvainTestBundle/Resources/config/routing.yml"

Attention, dans cet exemple, je n’ai pas crée de route particulière, il faut donc désactiver la route _welcome (activée en environnement de développement, dans le fichier /app/config/routing_dev.yml).

04/08/2011 — Mots-clés : , — Classé dans GeekVoir les 3 commentaires

Création d’un projet Symfony2

Je découvre petit à petit Symfony2, donc j’en profite pour noter quelque part mes différentes découvertes.

Installation simple

Il faut télécharger l’édition standard de Symfony2 à l’adresse suivante : http://symfony.com/download. Comme c’est une première découverte du framework, je ne vais pas aborder le versionning pour l’instant.

L’archive contient un dossier Symfony, il faut extraire le contenu de ce dossier à la racine du serveur Web (ou utiliser un virtualhost en le faisant pointer sur /web, comme en symfony 1).

On se retrouve donc dans un dossier de travail contenant ceci :

/app
/bin
/src
/vendor
/web
deps
deps.lock
LICENSE
README.md

Il suffit d’aller sur http://xxxx/config.php pour avoir un rapide test de la compatibilité du système pour exécuter Symfony2.

Ne pas oublier de donner les droits d’écriture à l’utilisateur Apache aux dossiers /app/cache et /app/logs

Configuration

Il y a un assistant qui facilite la création du fichier app/config/parameters.ini, il faut se rendre à l’adresse http://xxxx/app_dev.php/_configurator/step/0

Ce fichier contient, entre autres, la config BDD et SMTP :

; These parameters can be imported into other config files
; by enclosing the key with % (like %database_user%)
; Comments start with ';', as in php.ini
[parameters]
    database_driver   = pdo_mysql
    database_host     =
    database_name     =
    database_user     =
    database_password =

    mailer_transport  = smtp
    mailer_host       = localhost
    mailer_user       =
    mailer_password   =

    locale            = en

    secret            = ThisTokenIsNotSoSecretChangeIt

Ayé!

Symfony2 est fonctionnel! Et une jolie page d’accueil permet de jouer avec la barre de débug (profiler) et même de découvrir une mini démo de ses fonctionnalités (hello world, sécurité utilisateur) : http://xxxx/app_dev.php

Pour en savoir un peu plus au sujet de la mise en place du versionning d’un projet Symfony2 avec git : How to Create and store a Symfony2 Project in git.

Prochaine étape, découverte des bundles

04/08/2011 — Mots-clés : , — Classé dans GeekEcrire un commentaire

Sélection de liens HTML, CSS & jQuery

jQuery

CSS

HTML 5

Et un petit dernier pour la route : HTML5/CSS3 cheatsheet.

10/05/2011 — Mots-clés : , , — Classé dans GeekEcrire un commentaire

Créer un serveur SFTP sans accès shell

Un serveur FTP, c’est bien, mais un serveur SFTP c’est bien mieux car tout passe par une liaison SSH, donc cryptée. L’inconvénient, c’est que le serveur openssh-server utilise les comptes utilisateurs Unix, donc les utilisateurs peuvent avoir accès à l’ensemble du disque dur (suivant leurs droits), et même se connecter à un shell.

Installation de MySecureShell

Il faut ajouter une source APT au fichier /etc/apt/sources.list :

deb http://mysecureshell.free.fr/repository/index.php/debian testing main

Et ajouter la clé du dépot :

gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys E328F22B; gpg --export E328F22B | sudo apt-key add -
sudo apt-get update
sudo apt-get install mysecureshell

Ajout d’un utilisateur

sudo adduser --home /home/toto --shell /bin/MySecureShell toto

Impossible de transférer des fichiers, erreur exitcode 10

En cas de message d’erreur exitcode 10 lors de la copie de fichiers, il faut augmenter le nombre de connexions autorisées en éditant le fichier /etc/ssh/sftp_config :

LimitConnectionByUser 3

Sources

15/04/2011 — Mots-clés : , , , — Classé dans Geek1 commentaire

Utiliser Pure-FTP avec MySQL

Installez pure-ftp :

sudo apt-get install pure-ftpd-mysql

Connectez-vous au serveur MySQL :

mysql -u root -p

Créez l’utilisateur MySQL ftp (en changeant le mot de passe) :

CREATE USER 'ftp'@'localhost' IDENTIFIED BY 'mot_de_passe';
GRANT USAGE ON *.* TO 'ftp'@'localhost' IDENTIFIED BY 'mot_de_passe';
CREATE DATABASE IF NOT EXISTS `ftp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON `ftp`.* TO 'ftp'@'localhost';

Ensuite, créez la table qui contiendra les utilisateurs :

USE `ftp`;
CREATE TABLE `users` (
`login` varchar(16) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`is_active` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
`password` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`uid` varchar(11) COLLATE utf8_unicode_ci NOT NULL DEFAULT '-1',
`gid` varchar(11) COLLATE utf8_unicode_ci NOT NULL DEFAULT '-1',
`home` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`up_bandwidth_kbps` smallint(5) NOT NULL DEFAULT '0',
`down_bandwidth_kbps` smallint(5) NOT NULL DEFAULT '0',
`comment` tinytext COLLATE utf8_unicode_ci NOT NULL,
`quota_megabytes` smallint(5) NOT NULL DEFAULT '0',
PRIMARY KEY (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
exit;

Pour créer un utilisateur FTP, il faut exécuter la requête suivante :

INSERT INTO `users` (`login`, `is_active`, `password`, `uid`, `gid`, `home`, `up_bandwidth_kbps`, `down_bandwidth_kbps`, `comment`, `quota_megabytes`) VALUES('login', '1', md5('password'), '1000', '1000', '/home/login', 0, 0, '', 0);

Maintenant que MySQL est prêt, il faut configurer pure-ftp en éditant le fichier /etc/pure-ftpd/db/mysql.conf avec les paramètres MySQL crées précédement :

# Optional : MySQL server name or IP. Don't define this for unix sockets.
# MYSQLServer     127.0.0.1

# Optional : MySQL port. Don't define this if a local unix socket is used.
# MYSQLPort       3306

# Optional : define the location of mysql.sock if the server runs on this host.
MYSQLSocket      /var/run/mysqld/mysqld.sock

# Mandatory : user to bind the server as.
MYSQLUser       ftp

# Mandatory : user password. You must have a password.
MYSQLPassword   mot_de_passe

# Mandatory : database to open.
MYSQLDatabase   ftp

# Mandatory : how passwords are stored
# Valid values are : "cleartext", "crypt", "md5" and "password"
# ("password" = MySQL password() function)
# You can also use "any" to try "crypt", "md5" *and* "password"
MYSQLCrypt      md5

# In the following directives, parts of the strings are replaced at
# run-time before performing queries :
#
# \L is replaced by the login of the user trying to authenticate.
# \I is replaced by the IP address the user connected to.
# \P is replaced by the port number the user connected to.
# \R is replaced by the IP address the user connected from.
# \D is replaced by the remote IP address, as a long decimal number.
#
# Very complex queries can be performed using these substitution strings,
# especially for virtual hosting.

# Query to execute in order to fetch the password
MYSQLGetPW      SELECT password FROM users WHERE login="\L" AND is_active="1"

# Query to execute in order to fetch the system user name or uid
MYSQLGetUID     SELECT uid FROM users WHERE login="\L" AND is_active="1"

# Optional : default UID - if set this overrides MYSQLGetUID
#MYSQLDefaultUID 1000

# Query to execute in order to fetch the system user group or gid
MYSQLGetGID     SELECT gid FROM users WHERE login="\L" AND is_active="1"

# Optional : default GID - if set this overrides MYSQLGetGID
#MYSQLDefaultGID 1000

# Query to execute in order to fetch the home directory
MYSQLGetDir     SELECT home FROM users WHERE login="\L" AND is_active="1"

# Optional : query to get the maximal number of files
# Pure-FTPd must have been compiled with virtual quotas support.
# MySQLGetQTAFS  SELECT QuotaFiles FROM users WHERE login="\L" AND is_active="1"

# Optional : query to get the maximal disk usage (virtual quotas)
# The number should be in Megabytes.
# Pure-FTPd must have been compiled with virtual quotas support.
MySQLGetQTASZ  SELECT quota_megabytes FROM users WHERE login="\L" AND is_active="1"

# Optional : ratios. The server has to be compiled with ratio support.
# MySQLGetRatioUL SELECT ULRatio FROM users WHERE login="\L" AND is_active="1"
# MySQLGetRatioDL SELECT DLRatio FROM users WHERE login="\L" AND is_active="1"

# Optional : bandwidth throttling.
# The server has to be compiled with throttling support.
# Values are in KB/s .
MySQLGetBandwidthUL SELECT up_bandwidth_kbps FROM users WHERE login="\L" AND is_active="1"
MySQLGetBandwidthDL SELECT down_bandwidth_kbps FROM users WHERE login="\L" AND is_active="1"

# Enable ~ expansion. NEVER ENABLE THIS BLINDLY UNLESS :
# 1) You know what you are doing.
# 2) Real and virtual users match.
# MySQLForceTildeExpansion 1

# If you upgraded your tables to transactionnal tables (Gemini,
# BerkeleyDB, Innobase...), you can enable SQL transactions to
# avoid races. Leave this commented if you are using the
# traditionnal MyIsam databases or old (< 3.23.x) MySQL versions.
# MySQLTransactions On

Il reste à configurer certaines options de pure-ftp en créant un fichier par paramètre avec sa valeur. Les noms sont assez explicites :

cd /etc/pure-ftpd-conf
sudo echo ,21 > Bind
sudo echo 4500 4600 > PassivePortRange
sudo echo yes > ChrootEveryone
sudo echo yes > ProhibitDotFilesRead
sudo echo yes > ProhibitDotFilesWrite
sudo echo yes > NoChmod
sudo echo yes > BrokenClientsCompatibility
sudo echo 4 > MaxClientsPerIP
sudo echo 20 > MaxClientsNumber
sudo echo no > PAMAuthentication
sudo echo no > UnixAuthentication
sudo /etc/init.d/pure-ftpd restart

Et c’est tout. Source : How to install and configure pure-ftpd

27/02/2011 — Mots-clés : , , — Classé dans GeekEcrire un commentaire

Installer un tunnel SSH

Si vous êtes sur un réseau qui est surveillé ou limité, il peut être utile d’avoir accès à un serveur situé « à l’extérieur » et de créer un tunnel SSH afin de s’en servir comme d’un serveur proxy. L’avantage est que tout le trafic réseau est crypté jusqu’au serveur proxy et que personne ne peut voir, ni filtrer ce qui y passe. Ceci va être très utile en France car, grâce à la loi LOPPSI, l’Internet Français va prochainement ressembler à celui de la Chine.

Côté serveur

Il faut tout simplement installer OpenSSH (qui a de fortes chances d’être déjà installé) :

sudo apt-get install ssh

Si le réseau de votre boulot bloque le port SSH (ce qui est fort possible), il faudra changer le port utilisé par le serveur en éditant le fichier /etc/ssh/sshd_config (en utilisant le port 443 par exemple, ou tout autre port non utilisé) :

# What ports, IPs and protocols we listen for
Port 443

Et c’est tout, le serveur est maintenant prêt à faire suivre les requêtes TCP d’un client SSH.

Côté client

Client MacOS

Le petit utilitaire SSHTunnel est parfait pour cela et assez simple à configurer.

Client Linux

Il existe un outil Gnome pour configurer graphiquement les tunnels SSH sur une machine Linux : gstm (SSH Tunnel Manager), qui se contente de lancer la commande suivante :

ssh -N -f user@serveur -p 443 -D9999

Toutes les requêtes envoyées vers localhost:9999 seront maintenant encapsulées dans des paquets SSH et redirigées via serveur:443. Les options -N -f servent à éviter d’ouvrir la console SSH distante.

Client Windows

Sous Windows, il y a le célèbre PuTTY, et un tutorial assez simple pour le configurer pour une utilisation avec un tunnel.

Pour plus d’informations

Vous pouvez trouver plus d’informations sur ces différents liens :

10/02/2011 — Mots-clés : , — Classé dans GeekEcrire un commentaire

Sauvegarder des bases MySQL avec SVN

Voici un petit script bash qui permet de versionner sur un dépôt SVN des dumps de bases de données MySQL. Il crée un dump au format SQL par base.

L’option --skip-extended-insert permet d’avoir un enregistrement par ligne, ce qui sera très pratique pour les diff SVN et l’option --skip-dump-date retire le timestamp à la fin du fichier, et évite ainsi de créer une nouvelle version du fichier si il n’y a eu aucune modification sur la base.

J’ai fait ce script vite fait hier soir, et il fonctionne bien pour moi, je pense pouvoir l’améliorer à l’avenir et suis ouvert à toute proposition ;) Il suffit juste de configurer les 6 variables au début du fichier et de le mettre dans une crontab, et le tour est joué!

#!/bin/bash

export SVN_USERNAME='svn_user'
export SVN_PASSWORD='svn_pwd'
export SVN_REPOSITORY='http://my_svn_repository.com/'
export MYSQL_USERNAME='mysql_user'
export MYSQL_PASSWORD='mysql_pwd'
export TMP_DIRECTORY='/tmp/mysqlsvn_backup_tmp'

if [ -d $TMP_DIRECTORY ]; then
        echo "Cleaning tmp directory"
        rm -Rf $TMP_DIRECTORY
fi;

echo "Initializing tmp directory"
mkdir $TMP_DIRECTORY
cd $TMP_DIRECTORY

echo "Checking out repository"
svn co $SVN_REPOSITORY . --username=$SVN_USERNAME --password=$SVN_PASSWORD

for DB_NAME in `echo 'SHOW DATABASES;' | mysql -u$MYSQL_USERNAME -p$MYSQL_PASSWORD --batch -N`; do
        export filename=$DB_NAME.sql

        echo "Dumping '$DB_NAME' database"
        mysqldump -u$MYSQL_USERNAME -p$MYSQL_PASSWORD --skip-extended-insert --skip-dump-date $DB_NAME > $filename

        svn add $filename
done

echo "Sending files to repository"
svn ci -m "Automatic backup $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M)" 

echo "Removing tmp directory"
rm -Rf $TMP_DIRECTORY

05/02/2011 — Mots-clés : , , — Classé dans GeekVoir les 3 commentaires

Sélection de liens WordPress

02/02/2011 — Mots-clés : — Classé dans Geek1 commentaire

Optimiser WordPress avec crontab

WordPress utilise une mécanique interne pour exécuter des tâches planifiées (gestion du cache, publication d’articles à une date précise, etc…), il s’agit de wp-cron. A chaque requête sur une page WordPress, wp-cron va déterminer s’il doit s’exécuter ou non ; si c’est le cas, le chargement de la page sera considérablement plus long.

Pour éviter cela, il suffit de désactiver cette fonction et de créer une tâche planifiée sur le serveur qui va exécuter wp-cron indépendamment du chargement des pages.

Il faut d’abord désactiver wp-cron en ajoutant cette ligne au fichier /wp-config.php :

define('DISABLE_WP_CRON', true);

Et ensuite ajouter une ligne dans la crontab système (l’utilisateur n’a aucune importance, car c’est juste un appel via HTTP) en remplaçant par le chemin absolu :

* */1 * * * php /chemin/vers/wordpress/wp-cron.php

31/01/2011 — Mots-clés : — Classé dans Geek1 commentaire