Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

PHP e Cassandra, la prima applicazione con SimpleCassie

Creazione e interrogazione di un DB Cassandra, grazie all'API SimpleCassie
Creazione e interrogazione di un DB Cassandra, grazie all'API SimpleCassie
Link copiato negli appunti

Su Database.HTML.it, abbiamo recentemente fatto la conoscenza di Cassandra, il database "nosql" della scuderia Apache. Abbiamo esaminato la logica di immagazzinamento dei dati del server, cercando anche dei paralleli con le più familiari strutture dei classici RDBMS.

In questo articolo, come promesso nel precedente, ci occupiamo dell'utilizzo reale di Cassandra e alla sua integrazione con un linguaggio di sviluppo Web, in questo caso il PHP.

La libreria adatta a questo scopo si chiama SimpleCassie e fornisce un set funzioni di accesso in lettura e scrittura verso il database. Dopo aver scaricato la libreria in una directory a piacimento ed aver lanciato Cassandra con il comando visto in precedenza è possibile in pochissime righe di codice testare una prima connessione; per fare questo è sufficiente creare un file test.php nella stessa cartella di SimpleCassie con il listato:

<?php
  require_once('SimpleCassie.php');
  $cassie = new SimpleCassie('127.0.0.1', 9160);
  if(!$cassie->isConnected())
    throw new Exception('Impossibile connettersi');
  else
    echo("Connessione riuscitan");
?>

ed eseguirlo da linea di comando digitando dall'interno della stessa cartella:

php test.php
# -> Connessione riuscita

La demo che realizzeremo verte alla creazione di un catalogo su Cassandra contenente l'inventario degli oggetti presenti in una normale libreria domestica. Gli oggetti saranno ricercabili per scaffale e per tipologia.

La prima operazione da fare è definire questa nuova 'base dati' all'interno dell'elenco dei keyspaces contenuti nel file storage-conf.xml aggiungendo all'elemento Keyspace il seguente listato che definisce le tre columnfamily di cui abbiamo bisogno:

<Keyspace Name="Inventario">
  <ColumnFamily CompareWith="UTF8Type" Name="Scaffale"/>
  <ColumnFamily CompareWith="UTF8Type" Name="Oggetto"/>
  <ColumnFamily CompareWith="UTF8Type" Name="Tipologie"/>
</Keyspace>

Utilizzando SimpleCassie è ora possibile popolare le columnfamily appena create secondo le necessità dell'applicazione. Va notato che la struttura concordata da qui in poi per gestire l'inventario non è in alcun modo percepita né memorizzata all'interno di Cassandra, per il quale esistono solamente informazioni da salvare o da recuperare in termini di column e supercolumn, ma è soltanto un modus operandi che verrà implementato dal codice PHP.

Ecco il semplice listato da concatenare al precedente file test.php per la popolazione del database:

$keyspaces = array(
    'Inventario' => array(
      // Oggetto ColumnFamily
      'Oggetto' => array(
        "photocamera bag" => array(
          "size" => "10x12cm",
          "desc" => "la borsa porta macchina fotografica",
          "type" => "bag"
        ),
        "wicked" => array(
          "pages" => "409",
          "author"=> "Gregory Maguire",
          "desc"  => "The life and times of the Wicked Witch of the West",
          "type"  => "book"
        ),
        "computer bag" => array(
          "desc" => "la borsa del portatile",
          "size" => "50x20cm",
          "type" => "bag"
        )
      ),
      // Scaffale ColumnFamily
      'Scaffale' => array(
        "ripiano basso" => array("item1"=> "computer bag" ),
        "ripiano alto"  => array("item1"=> "wicked",
                                 "item2"=> "photocamera bag")
      ),
      // Tipologie ColumnFamily
      'Tipologie' => array(
        "bag"  => array("item1"=> "photocamera bag",
                        "item2"=> "computer bag"),
        "book" => array( "item1"=> "wicked" )
      )
    )
  );
  // Inserisco in Cassandra i dati sull'inventario
  foreach ($keyspaces as $keyspace => $cfs)
    foreach($cfs as $cf => $keys)
      foreach($keys as $key => $columns)
        foreach($columns as $name => $value)
          $cassie->keyspace($keyspace)->cf($cf)->key($key)->column($name)->set($value);

Riavviando Cassandra ed eseguendo test.php, secondo le modalità esposte nell'articolo precedente, il database verrà popolato delle informazioni indicate. È importante notare come l'unica columnfamily contenente bagaglio informativo sia Oggetto, mentre le altre due non fanno altro che raggruppare gli oggetti di volta in volta in insiemi stabiliti secondo logiche specifiche.

A questo punto è possibile operare alcune estrazioni su quanto appena inserito; il seguente codice, sempre da concatenare a test.php, si occupa di estrarre nel primo caso l'elenco di tutte le column all'interno della row bag della columnfamily Tipologie mentre nel secondo le singole descrizioni degli oggetti (column desc della columnfamily Oggetto) linkati dalla row ripiano alto nella columnfamily Scaffale:

// Recuperiamo tutte le bag
print("Var Dump di tutte le borsen");
$count = $cassie->keyspace('Inventario')->cf('Tipologie')->key('bag')->count();
var_dump($cassie->key('bag')->slice($count,false));
// Stampiamo la descrizione di tutto quanto sta sullo scaffale in alto
print("nnStampo la descrizione degli oggetti nello scaffale in alto:n");
$count =  $cassie->keyspace('Inventario')->cf('Scaffale')->key('ripiano alto')->count();
$items =  $cassie->key('ripiano alto')->slice($count,false);
foreach($items as $i => $column){
  print(" - Elemento: ".$column->column->value."n");
  $item = $cassie->keyspace('Inventario')->cf('Oggetto')->key($column->column->value)->column('desc')->get();
  print(" - Descrizione: ".$item->column->value."n");
}

Lanciando per l'ultima volta test.php l'interprete stamperà a video i risultati delle due interrogazioni.

Conclusioni

Nella mia esperienza di sviluppatore ho notato che l'avvicendamento dei linguaggi e delle tecniche di programmazione raramente interessa il meccanismo di persistenza dei dati. MySql e i suoi cugini più o meno enterprise sono sulla scena da più di dieci anni e fino a pochissimo tempo fa hanno rappresentato una scelta praticamente obbligata per chiunque volesse intraprendere lo sviluppo di un'applicazione, web o meno, che richiedesse una qualche forma di memorizzazione e ricerca di informazioni. La nascita di tutti questi nuovi prodotti rappresenta quindi ai miei occhi un segnale di forte cambiamento che sottolinea come il mondo web sia cresciuto al punto di necessitare strumenti di memorizzazione studiati appositamente per le sue necessità. Inoltre la rapida e veloce proliferazione di questi prodotti indica anche che vi è una sufficientemente larga fetta di sviluppatori e di aziende (basti pensare a Facebook) che sta investendo capitale, tempo ed energie nella creazione e nel mantenimento di questi DBMS; tutte buone ragioni quindi per farsi un'idea su quali siano potenzialità ed ambiti di utilizzo di questi strumenti.

Ti consigliamo anche