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