Tra i vari client disponibili per interagire con Redis in PHP, ve n'è uno raccomandato dal sito ufficiale che risponde al nome di Predis.
Lo si può installare comodamente con Composer, il più diffuso package manager per questo linguaggio, facendo riferimento al suo repository su Packagist.
Il comando necessario (una volta installato Composer) è il seguente:
composer require predis/predis
In alternativa, ci si può rivolgere al relativo canale PEAR (su HTML.it è disponibile un'approfondimento dedicato proprio a a PEAR).
Supponendo di aver proceduto mediante Composer, troveremo nel nostro progetto la cartella vendor con all'interno la libreria scaricata ed il file autoload.php
che andrà incluso negli script PHP.
Connessione a Redis
Per eseguire una connessione al DBMS, prima operazione da svolgere, si potrà procedere così:
require "vendor/autoload.php"; Predis\Autoloader::register(); $redis = new Predis\Client(array( "scheme" => "tcp", "host" => "192.168.56.3", "port" => 5555, "password" => "secret"));
Dopo di ciò sarà possibile usare $redis
come client. I parametri passati corrispondono, rispettivamente, al protocollo usato a livello
trasporto (tcp
), l'indirizzo di rete su cui il server gira, la porta TCP dove contattarlo e la password eventualmente indispensabile per eseguire l'accesso.
Tali valori andranno personalizzati al momento dell'utilizzo.
Qualora la connessione fallisse, ad esempio per indisponibilità del server o a causa della fornitura di parametri di rete non corretti, verrebbe
lanciata un'eccezione di tipo Predis\Connection\ConnectionException
che può essere controllata con un costrutto try...catch
.
Ad esempio:
$redis = new Predis\Client(array( "scheme" => "tcp", "host" => "192.168.56.3", "port" => 5555, "password" => "secret")); try { /* * invocazione di metodi sull'oggetto $redis */ } catch(Predis\Connection\ConnectionException $e) { die("Connessione a Redis non riuscita!"); }
Si noti che la creazione del client è stata eseguita prima del try...catch
e ciò non rischia di creare problemi in quanto la connessione
in Predis è "lazy" ossia viene aperta realmente al primo comando che ha bisogno di sfruttarla. Pertanto, sarà sufficiente includere solo i metodi
invocati su $redis
nel blocco try
. Per verificare che il server sia raggiungibile, il client Predis dispone anche del metodo ping
che, come il
comando da console, restituirà la stringa PONG
in caso di verifica con esito positivo.
Salvare e recuperare stringhe
Predis permette di salvare e recuperare stringhe da Redis con metodi che ricordano molto i comandi da console. Vediamo una sessione di
esempio:
// impostiamo la stringa "nome" a "pesce" $redis->set("nome", "pesce"); echo $redis->get("nome"); // concateniamo "cane" a "nome" per ottenere "pescecane" $redis->append("nome", "cane"); echo $redis->get("nome"); // chiediamo la lunghezza della stringa echo $redis->strlen("nome"); // incrementiamo il valore di una chiave ancora non definita $redis->incr("contatore"); $redis->incr("contatore"); $redis->incr("contatore"); $redis->incr("contatore"); echo $redis->get("contatore"); // stampa 4 // decrementiamo due volte la stessa chiave $redis->decr("contatore"); $redis->decr("contatore"); // stampa 2 echo $redis->get("contatore");
Con i metodi set
e get
, rispettivamente, impostiamo e leggiamo il valore di una stringa mentre con append
concateniamo una stringa ad un'altra. Con il metodo strlen
possiamo chiedere la lunghezza di una stringa immagazzinata.
Sono contemplati anche i metodi incr
e decr
molto utili in varie circostanze per definire e manipolare contatori.
È contemplata anche la possibilità di avere chiavi a scadenza. Si usa il metodo setex
per impostarle e get
per leggerne
il valore mentre con ttl possiamo ottenere il numero di secondi residuali:
// impostiamo la chiave "temporanea" per la durata di 30 secondi $redis->setex("temporanea", 30, "dura 30 secondi"); // leggiamo il valore .. stampa "dura 30 secondi" echo $redis->get("temporanea"); // chiediamo il tempo residuo echo $redis->ttl("temporanea");
Gestione di liste
L'inserimento di elementi in una lista può essere eseguito dalle estremità con i metodi lpush
e rpush
(rispettivamente, a sinistra e a destra ossia in testa e in coda) o all'interno della struttura dati fornendo la posizione con linsert
:
// inseriamo in testa un elemento $redis->lpush("animali", "cobra"); // inseriamo in testa più elementi $redis->lpush("animali", "tigre", "elefante", "iena", "pantera"); // inseriamo altri elementi in coda $redis->rpush("animali", "macaco", "orso", "leone"); // inseriamo un elemento "prima" della stringa "macaco" $redis->linsert("animali", "BEFORE", "macaco", "mangusta"); // stampiamo la lunghezza della lista ... stampa 9 echo $redis->llen("animali");
Si può anche modificare l'elemento in una data posizione. Con la seguente espressione modifichiamo quello in posizione 3 ("tigre") con
la stringa "iguana":
$redis->lset("animali", 3, "iguana");
Possiamo ottenere l'elenco degli elementi inseriti nella lista con il metodo lrange
. Gli indici che riceve come secondo e terzo
argomento sono il punto d'inizio e di fine della scansione. Qualora l'ultimo argomento equivalesse a -1 (come nel codice che segue) verrebbe
restituita l'intera lista:
$redis->lrange("animali", 0, -1);
Tanto per avere idea dell'effetto, quello che segue è il risultato dell'invocazione stampato con la funzione PHP var_dump
array (size=9) 0 => string 'pantera' (length=7) 1 => string 'iena' (length=4) 2 => string 'elefante' (length=8) 3 => string 'iguana' (length=6) 4 => string 'cobra' (length=5) 5 => string 'mangusta' (length=8) 6 => string 'macaco' (length=6) 7 => string 'orso' (length=4) 8 => string 'leone' (length=5)
L'eliminazione di elementi da una lista solitamente può seguire due strade: la prima vede l'eliminazione dell'oggetto con lrem
senza che questo venga letto, la seconda
vede l'impiego dei metodi lpop
e rpop
che svolgono l'estrazione del valore, rispettivamente, da sinistra o da destra che viene rimosso e restituito per un'ultima lettura:
// partiamo dalla lista ['pantera','iena','elefante','iguana','cobra','mangusta','macaco','orso','leone'] echo $redis->lrem("animali", 1, "iena"); // elimina iena // cancella e restituisce "pantera" (primo da sinistra) echo $redis->lpop("animali"); // cancella e restituisce "leone" (primo da destra) echo $redis->rpop("animali"); // rimaniamo con ['elefante','iguana','cobra','mangusta','macaco','orso']
Uso di hashmap
Anche per quanto riguarda le hashmap, vengono offerti molti metodi. Possiamo creare un hashmap passando un elenco di chiavi e valori (hmset
),
ottenere il valore di un singolo campo (hget
) o l'elenco completo dei valori inclusi (hgetall
), verificare se una chiave è presente nella mappa (hexists
) e quanti
sono i suoi campi (hlen
), possiamo inoltre richiedere un elenco dei campi (hkeys
). Quello che segue è un esempio riassuntivo delle predette operazioni:
// impostiamo un hashmap di tre campi $redis->hmset("persona", "nome", "Alvaro", "cognome", "Bianchi", "eta", "25"); // leggiamo il valore della chiave "nome" ... stampa "Alvaro" echo $redis->hget("persona", "nome"); // otteniamo il contenuto completo della hashmap $redis->hgetall("persona"); // verifichiamo la struttura dati contiene la chiave "citta" (non la contiene) if ($redis->hexists("persona", "citta")) echo "Chiave presente"; else echo "Chiave non presente"; // chiediamo il numero di campi ... restituisce 3 var_dump($redis->hlen("persona")); // chiediamo l'elenco delle chiavi ... restituisce l'array ["nome", "cognome", "eta"] var_dump($redis->hkeys("persona"));