Installation d'un environnement de développement Symfony2 / Cassandra avec le bundle M6Web/CassandraBundle

Installation d'un environnement de dev Symfony2 / Cassandra sur Linux Debian 8 avec le bundle M6Web/CassandraBundle

Publié le 28/09/2015

1 - Pré-requis

On va avoir besoin d'une VM VirtualBox en bridge avec les caractéristiques suivantes :

  • - 2 CPU
  • - 4 Go RAM minimum

2 - Installation

2.1 - Installation de Java 8


echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
apt-get update
apt-get install oracle-java8-installer

2.2 - Installation de Cassandra

Ajout du repository datastax :


nano /etc/apt/sources.list.d/cassandra.sources.list

deb http://debian.datastax.com/community stable main

Ajout de la clé :


apt-get install curl
curl -L http://debian.datastax.com/debian/repo_key | apt-key add -

Installation avec apt :


apt-get update
apt-get install dsc22 cassandra-tools

3 - Installation d'Apache/PHP et la Cassandra PHP Extension

Installation de PHP, Apache, Openssl, GCC et les libraries nécessaires à la compilation :

apt-get install g++ make cmake libuv-dev libssl-dev libgmp-dev php5 php5-dev openssl libpcre3-dev git

Installation du DataStax C/C++ Driver :

Compilation du driver :


git clone https://github.com/datastax/cpp-driver.git
mkdir cpp-driver/build
cd cpp-driver/build
cmake ..
make

Installation de la Cassandra PHP Extension :


cd ../..
git clone https://github.com/datastax/php-driver.git
cd php-driver
git submodule update --init
cd ext
./install.sh
phpize
./configure
make install

Ajout de l'extension au fichier php.ini de la cli:

echo -e "; DataStax PHP Driver\nextension=cassandra.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`

Ajout de l'extension au fichier php.ini d'Apache :

nano /etc/php5/apache2/php.ini


; DataStax PHP Driver
extension=cassandra.so

Redémarrage d'Apache :

service apache2 restart

Vérification de l'activation du module avec phpinfo() :

php -i | grep cassandra

4 - Installation de Symfony 2

Création d'un vhost pour notre application web :

nano /etc/apache2/sites-available/cassandra_sf.conf


<VirtualHost *:80>

        ServerName cassandra-sf.local

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/cassandra_sf/web

        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/cassandra_sf/web/>
                DirectoryIndex app.php
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

</VirtualHost>

Configuration du date.timezone dans /etc/php5/apache2/php.ini et /etc/php5/cli/php.ini, modifier la ligne suivante dans les deux fichiers :

date.timezone = Europe/Paris

Téléchargement de composer :

cd /var/www/
curl -s https://getcomposer.org/installer | php
php composer.phar create-project symfony/framework-standard-edition /var/www/cassandra_sf

Activation du mode rewrite et du vhost :

a2enmod rewrite
a2ensite cassandra_sf
service apache2 restart

Installation des vendors Symonfy2 :

cd /var/www
cp composer.phar cassandra_sf/
php composer.phar update

5 - Installation du bundle Cassandra

Ajout du bundle de fichier composer :


cd /var/www/cassandra_sf2/
nano composer.json



{
    "require": {
        "m6web/cassandra-bundle": "~1.0.0-beta",
    }
}

php composer.phar update m6web/cassandra-bundle

Enregistrement du bundle dans le kernel :

nano app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        new M6Web\Bundle\CassandraBundle\M6WebCassandraBundle(),
    );
}

6 - Configuration du bundle

nano app/config/config.yml

m6web_cassandra:
    clients:
        myclient:
            keyspace: "mykeyspace"
            contact_endpoints:
                - 127.0.0.1

7 - Création d'un bundle Main

Génération du bundle


php app/console generate:bundle --namespace=Csd/MainBundle

Laisser tous les choix par défauts.

Enregistrement du Bundle dans le kernel :


nano app/AppKernel.php

Ajout de la ligne suivante dans le tableau $bundle de la méthode registerBundles() :


new Csd\MainBundle\CsdMainBundle(),

8 - Création d'une route, action de controller

On va créer une route et une action de controller pour notre requête d'insert de test.

Création de la route :

nano src/Csd/MainBundle/Resources/config/routing.yml


csd_main_homepage:
    path:     /
    defaults: { _controller: CsdMainBundle:Default:index }

Ajout de la méthode indexAction() dans le controller DefaultController :


<<?php

namespace Csd\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use \Cassandra as Cassandra;

class DefaultController extends Controller
{
    public function indexAction()
    {
        $cassandra = $this->get('m6web_cassandra.client.myclient');

        $prepared = $cassandra->prepare("INSERT INTO test (id, title) VALUES(?, ?)");

        $batch     = new Cassandra\BatchStatement(Cassandra::BATCH_LOGGED);
        $batch->add($prepared, ['id' => 1, 'title' => 'my title']);
        $batch->add($prepared, ['id' => 2, 'title' => 'my title 2']);

        $cassandra->execute($batch);

        $statement = new Cassandra\SimpleStatement('SELECT * FROM test');
        $result = $cassandra->execute($statement);

        foreach ($result as $row) {
            // do something with $row
        }

        $statement = new Cassandra\SimpleStatement('SELECT * FROM test');
        $result = $cassandra->executeAsync($statement);

        return $this->render('CsdMainBundle:Default:index.html.twig');
    }
}

Création de la vue :

nano src/Csd/MainBundle/Resources/views/Default/index.html.twig

On ajoutera juste un hello world pour dire que notre requête s'est bien réalisée.

9 - Clean du cache et generation des assets


php app/console assets:install web
php app/console assetic:dump --env=prod --no-debug
chmod -R 777 app/cache app/logs
rm -rf app/cache/*

10 - Création d'un keyspace

Un Keyspace dans Cassandra est assimilée à une base de données en MySQL. Elle va regrouper une ensemble de colonnes types. Ces dernières vont représenter nos tables.

On voir pouvoir afficher la liste de nos Keyspace avec la commande : DESC KEYSPACE.


CREATE KEYSPACE demo WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy' };
USE demo;
CREATE TABLE test (id int, title text, PRIMARY KEY (id));

Sources :

https://github.com/M6Web/CassandraBundle
https://github.com/datastax/php-driver
https://github.com/datastax/php-driver/blob/master/ext/README.md
http://datastax.github.io/cpp-driver/topics/building/
http://docs.datastax.com/en/cassandra/2.2/cassandra/install/installDeb.html