MongoDB: come installare i driver PHP in Centos 8, ed esempi di utilizzo.
Dopo esserci occupati dell'installazione di MongoDB in Centos 8, e delle operazioni CRUD utilizzando la shell amministrativa, oggi vediamo come utilizzare questo famoso database NoSQL nelle nostre pagine PHP.
Noi avevamo installato MongoDB in versione 4.4.1, in una distribuzione Centos 8 con PHP 7.2.
Abbiamo bisogno di installare i driver PHP specifici per questa versione di Mongo, e successivamente una libreria.
Installazione del driver PHP via PECL
Per istallare il driver dobbiamo utilizzare pecl, un repository per le estensioni PHP. Lanciamo il comando
# pecl install mongodb
L'estensione mongodb verrà installata installata qui:
/usr/lib64/php/modules/mongodb.so
Al termine dell'installazione occorre modificare il file di configurazione di php "php.ini", ad esempio utilizzando l'editor "vi"
# vi /etc/php.ini
Aperto il file aggiungiamo questa riga
extension=mongodb.so
Salviamo il file, e riavviamo il server web, ad esempio Apache
systemctl restart httpd.service
Installazione del driver PHP manualmente
In alternativa all'installazione via PECL possiamo procedere all'installazione del driver manualemente, attraverso la compilazione dal codice sorgente.
Occorre scaricare il sorgente, e lo facciamo via GIT, il noto software di controllo di versione distribuito utilizzabile da interfaccia a riga di comando.
Quindi innanzitutto dovete avere GIT installato e lo facciamo tramite yum (o dnf).
# yum install git
Con GIT intallato possiamo scaricare il sorgente
# git clone https://github.com/mongodb/mongo-php-driver.git
Finito il download, posizioniamoci nella cartella "mongo-php-driver"
# cd mongo-php-driver
e procediamo con la compilazione del sorgente seguendo questa procedura
# git submodule update --init
# phpize
# ./configure
# make all
# make install
Ultimata l'installazione, modifichiamo il file "php.ini" presente nella directory "etc", aggiungendo la riga
extension=mongodb.so
Per essere certi che mongodb sia installato, digitiamo la linea di comando php -m che visualizzerà la lista dei moduli installati, che filtriamo con grep
php -m | grep mongodb
L'output sarà "mongodb".
Installazione della libreria MongoDB
Ultimata l'installazione del driver, occorre installare anche una apposita libreria mongodb tramite lo strumento composer.
Composer è un gestore di pacchetti PHP. Se non è installato sul vostro server, dovete procedere alla sua installazione.
Se non avete Composer, o non sapete cosa sia, vi rimando a questo articolo dedicato alla sua installazione ed utilizzo.
Vogliamo utilizzare MongoDB in un nostro progetto PHP, presente ad esempio nella directory "/var/www/html/test".
Create quindi la directory "test" e posizionatevi al suo interno
# mkdir /var/www/html/test
# cd /var/www/html/test
Adesso che siamo dentro al progetto, diciamo a composer di installare mongodb
# composer require mongodb/mongodb
L'ouput sarà simile a questo
Using version ^1.7 for mongodb/mongodb
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
- Installing composer/package-versions-deprecated (1.11.99): Loading from cache
- Installing jean85/pretty-package-versions (1.5.1): Loading from cache
- Installing mongodb/mongodb (1.7.1): Loading from cache
Writing lock file
Generating autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
1 package you are using is looking for funding.
Composer avrà creato i file composer.json e composer.lock, e la directory "vendor" che contiene la librere e dipendenze.
Ultimata l'installazione possiamo finalmente testare la connessione a Mongo via PHP
Primo esempio di utilizzo di MongoDB in PHP
Come primo esempio visualizziamo la lista di tutti i database installati, che di default, sappiamo essere i seguenti: admin,congif,local
Crea un file index.php, che inserirai nella directory test,
<?php
require __DIR__ . '/vendor/autoload.php';
try {
$client = new MongoDB\Client('mongodb://localhost:27017');
foreach ($client->listDatabases() as $databaseInfo) {
var_dump($databaseInfo);
}
}
catch (Exception $e) {
echo $e->getMessage();
}
?>
Speighiamo nel dettaglio questo script
- Includiamo l'autoloader di Composer in modo da caricare le librerie
- Poi instanziamo un oggetto di classe Mongo, passandogli una stringa contenente i parametri di connessione: ci connettiamo al database MongoDB locale e sulla porta di defautl 27017. Non abbiamo previsto una autenticazione per l'accesso.
- Utilizzando la funzione listDatabases elenchiamo tutti i db presenti
- Abbiamo utilizzato la sintassi "try catch" per gestire eccezioni, come la mancata connessione al database
Se la connessione al database fosse stata autenticata, avremmo dovuto indicare anche username e password
$client = new MongoDB\Client('mongodb://username:password@localhost:27017');
Lanciamo lo script da linea di comando
# php index.php
Il risultato sarà
object(MongoDB\Model\DatabaseInfo)#7 (3) {
["name"]=>
string(5) "admin"
["sizeOnDisk"]=>
float(40960)
["empty"]=>
bool(false)
}
object(MongoDB\Model\DatabaseInfo)#8 (3) {
["name"]=>
string(6) "config"
["sizeOnDisk"]=>
float(49152)
["empty"]=>
bool(false)
}
object(MongoDB\Model\DatabaseInfo)#7 (3) {
["name"]=>
string(5) "local"
["sizeOnDisk"]=>
float(40960)
["empty"]=>
bool(false)
}
Dopo questo primo assaggio di Mongo, vediamo come creare in un database di nome "demo", che non esiste ancora, una collection (tabella) di nome "giocatori", che non esiste ancora, e tre documenti (record) contenenti coppie nome / valore rappresentate da nomi di giocatori con la relativa squadra di appartenenza .
Questo è lo script:
<?php
require __DIR__ . '/vendor/autoload.php';
$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->giocatori;
$result = $collection->insertOne( [ 'nome' => 'Ronaldo', 'squadra' => 'Juventus' ] );
echo "Inserted with Object ID '{$result->getInsertedId()}'\n";
$result = $collection->insertOne( [ 'nome' => 'Insigne', 'squadra' => 'Napoli' ] );
echo "Inserted with Object ID '{$result->getInsertedId()}'\n";
$result = $collection->insertOne( [ 'nome' => 'Chiellini', 'squadra' => 'Juventus' ] );
echo "Inserted with Object ID '{$result->getInsertedId()}'\n";
?>
Speighiamo nel dettaglio questo script
- Come prima cosa includiamo l'autoloader delle classi di Composer
- Poi instanziamo un oggetto di classe Mongo, passandogli una stringa contenente i parametri di connessione: ci connettiamo al database.
- Abbiamo quindi accesso all'oggetto $collection: ricordiamo che in Mongo le collection sono equivalenti alle tabelle dei database relazionali e se la collezione (o il database), non esiste, Mongo la creerà automaticamente al momento dell'inserimento del primo documento.
- Procediamo quindi all'inserimento del primo documento, con il metodo insertOne, ed otteniamo il suo ID: ricordiamo che obbligatoriamente ogni record in Mongo deve contenere la chiave "_id".
- Inseriamo altri due documenti
Volendo, avremmo potuto creare un variabile array, contenente le chiavi/valore del record, da utilizzare poi nel metodo insertOne
$giocatore = array (
"nome" => "Ronaldo",
"squadra" => "Juventus"
);
$result = $collection->insertOne( $giocatore );
Lanciamo lo script da linea di comando, ecco il risultato
# php index.php
Inserito con Object ID '5f885d276d084538c05d37c2'
Inserito con Object ID '5f885d276d084538c05d37c3'
Inserito con Object ID '5f885d276d084538c05d37c4'
Adesso che la nostra collection contiene dei record, operiamo una ricerca utilizzando la funzione find, che nei database relazionali è equivalente ad una select.
Cerchiamo tutti i giocatori appartenenti alla squadra Juventus: verranno estratti l'id e il nome dei giocatori dei due record presenti nel database.
<?php
require __DIR__ . '/vendor/autoload.php';
$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->giocatori;
$result = $collection->find( [ 'squadra' => 'Juventus' ] );
foreach ($result as $entry) {
echo $entry['_id'], ': ', $entry['nome'], "\n";
}
?>
Lanciamo lo script ed ecco il risultato
# php index.php
5f885d276d084538c05d37c2: Ronaldo
5f885d276d084538c05d37c4: Chiellini
Con questo esempio abbiamo concluso la spiegazione relativa all'installazione dei driver e librerie PHP per l'utilizzo di MongoDB. Con le conoscenze che già avrete, relative alle operazione di CRUD da shell amministrativa di Mongo, potete iniziare a sviluppare i vostri primi progetti con questo database.