Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. PHP et MySQL
  3. Énoncé 6 : La recherche et le multimédia
Extrait - PHP et MySQL Entraînez-vous à développer une application collaborative
Extraits du livre
PHP et MySQL Entraînez-vous à développer une application collaborative Revenir à la page d'achat du livre

Énoncé 6 : La recherche et le multimédia

Introduction

Durée

3 heures 40

Mots-clés

MongoDB, recherche, index, streaming, Composer

Objectifs

PHP est un environnement très facile à coupler avec d’autres technologies. Dans ce chapitre, c’est la base NoSQL MongoDB qui sert de support au stockage et à la recherche dans les fils de discussion multimédia de la messagerie instantanée Team Up.

Prérequis

Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après :

1.

Qu’est-ce qu’une base NoSQL ?

 

a.

Une base de données relationnelle

 

b.

Une base de données objets

 

c.

Une base de données analytique

 

d.

Une base de données conçue pour l’évolutivité (scability) et les performances même avec de forts volumes

2.

Que signifie BSON ?

 

a.

C’est un analyseur syntaxique

 

b.

Bootstrap Online

 

c.

Binary JavaScript Object Notation

 

d.

Byte Symbol Only

3.

À quoi sert Composer ?

 

a.

À récupérer des librairies et leurs dépendances au niveau applicatif

 

b.

À gérer les packages d’installation

 

c.

À étayer (scaffolding) un projet

 

d.

À injecter des dépendances au niveau des constructeurs de contrôleur

4.

Qu’est-ce que le streaming ?

 

a.

Une méthode pour déclencher des threads

 

b.

Une lecture continue de fichiers volumineux avec le protocole HTTP

 

c.

Le stockage de fichiers multimédias sur le serveur web

 

d.

La gestion des flux fichiers en PHP

Énoncé 6.1 Installer MongoDB et l’extension PHP

Durée estimative : 45 minutes

MongoDB est une solution NoSQL pour stocker et rechercher des documents semi-structurés (sans schéma prédéfini). MongoDB est particulièrement performant pour l’insertion en masse de données. Qui dit recherche d’information dit indexation. MongoDB dispose de fonctionnalités intégrées ou peut être associé à des technologies externes telles qu’Elastic Search. Nous n’avons pas besoin dans notre exemple de sortir « l’artillerie lourde », mais ce type d’architecture, fréquemment utilisée en production, s’avère assez simple à implémenter.

De nos jours, la majorité de ces solutions sont disponibles en installation locale (on-premise) ou bien en service à la demande (sur le Cloud). Si les développeurs choisissent plutôt la version à installer, de plus en plus d’environnements de production se déportent vers le Cloud pour adapter la puissance de calcul à la demande.

 Téléchargez et installez le serveur MongoDB Server Community depuis le site mongodb.com.

Lancez Compass (l’utilitaire de gestion de MongoDB) et connectez-vous à l’instance par défaut.

 Créez une base de données teamup...

Énoncé 6.2 Journalisation des discussions

Durée estimative : 30 minutes

La base MongoDB va être alimentée avec l’ensemble des fils de discussion développés dans la messagerie instantanée.

 Ajoutez au contrôleur chatController une action recordmessage(). Appelez cette action depuis la vue index.php chaque fois qu’un message est envoyé.

 Définissez une entité MessageEntity { from, attendee, message, date }.

 Ajoutez au projet une classe de service MessageService comportant une méthode recordMessage($messageEntity)

Utilisez la librairie MongoDB pour enregistrer un document dans la collection chat selon le schéma MessageEntity.

 Modifiez le code de l’action pour utiliser cette couche service.

 Envoyez quelques messages depuis l’interface Team Up.

 Vérifiez en ligne de commande MongoDB que les discussions sont bien enregistrées dans la base.

Énoncé 6.3 Enrichissement des messages avec du texte riche

Durée estimative : 35 minutes

Nous quittons le mode « texte brut » pour proposer aux utilisateurs de Team Up de rédiger des messages en texte riche. Pour cela, la librairie open source Summernote développée pour Bootstrap va apporter de nouvelles fonctionnalités à l’application.

 Importez dans le répertoire application/summernote le package de distribution de Summernote téléchargeable depuis le site https://www.summernote.org. Il s’agit du répertoire /dist comprenant des fichiers JavaScript (.js) et des feuilles de style (.css).

 Créez une page (action et vue) testrtb.do. Intégrez directement dans la vue le code suivant :

<link rel="stylesheet" href="summernote/summernote-lite.css"> 
<script type="text/javascript" src="summernote/summernote.js"></script> 
<script type="text/javascript" src="summernote/lang/summernote-fr-FR.js"></script> 
 
 <script type="text/javascript"> 
   $(document).ready(function() { 
     $('#richcontent').summernote({ 
       height: 300, 
       tabsize: 2, 
       lang: 'fr-FR' ...

Énoncé 6.4 Intégrer du contenu multimédia en streaming

Durée estimative : 40 minutes

L’intégration de contenus multimédias présente une difficulté notoire : le poids des fichiers qui peut atteindre plusieurs Go entraîne des temps de téléchargement assez longs. Pour surmonter ce problème, le protocole HTTP dispose d’un en-tête appelé Range qui permet de « découper » les fichiers au téléchargement, en les rendant bloc par bloc. Cette technique est appelée streaming.

 Implémentez dans le répertoire Services la classe LobStream (pour Large Object Binary). Cette classe réalise le streaming d’un flux fichier ou d’un bloc de données issu d’une base de données.

<?php 
/* 
* LobStream.php 
*/ 
class LobStream 
{ 
   private $path = ""; 
   private $stream = ""; 
   private $buffer = 102400; 
   private $start  = -1; 
   private $end    = -1; 
   private $size   = 0; 
    
   public $is_file; 
    
   public $is_blob; 
   public $blob; 
 
   public $content_type; 
   public $content_length; 
   public $last_modified; 
 
   function __construct() 
   { 
       $this->is_blob = true; 
       $this->is_file = false; 
   } 
 
   /** 
    * Définit un fichier comme source 
    * @param string $filepath 
    */ 
   public function set_file($filepath) 
   { 
       $this->path = $filepath; 
 
       $this->is_file = true; 
       ...

Énoncé 6.5 Stocker et accéder à des données BLOB dans MongoDB

Durée estimative : 40 minutes

L’inconvénient de stocker les fichiers dans l’arborescence du serveur web (sous www ou application par exemple), c’est qu’il est difficile de contrôler les accès de façon applicative. De plus, l’espace disque au niveau du front web est souvent réduit. La prochaine étape de notre développement consiste donc à insérer les vidéos dans MongoDB puis à les relire sur demande.

En standard, MongoDB permet de stocker des documents BSON jusqu’à 16 Mo. Cette valeur a été choisie pour optimiser les temps de transfert entre le serveur d’applications et le serveur MongoDB. Pour dépasser cette limitation, il faut recourir au module GridFS ou bien découper le fichier en plusieurs morceaux (chunks en anglais) ; c’est cette deuxième approche que nous allons suivre.

 Par défaut, MongoDB diffère l’écriture des documents dans la base, pour rendre la main au client le plus vite possible. En conséquence, les identifiants, s’ils ne sont pas transmis à l’insertion des documents dans les collections, ne sont pas connus au moment de l’appel. Notre programme a cependant besoin de faire le lien entre les différents blocs...

Énoncé 6.6 Rechercher dans les fils de discussion

Durée estimative : 30 minutes

Comme support de formats variés, MongoDB propose plusieurs fonctions de recherche. Nous mettons en œuvre la recherche textuelle au sein des fils de discussion Team Up.

 Modifiez l’action du formulaire de recherche de la barre de navigation pour pointer vers l’action recherche-recherche-search.do.

 Ajoutez en ligne de commande MongoDB un index texte sur la collection chat :

db.chat.createIndex( { from: "text", attendee: 'text', message: "text" } ) 

 Ajoutez une méthode search($username,$text) dans la classe MessageService. Cette méthode recherche dans la collection MongoDB chat des documents contenant du texte $text et dont l’utilisateur apparaît comme émetteur ou comme destinataire. La syntaxe MongoDB pour rechercher est la suivante :

{$text: {$search:'hello'}} 

 Ajoutez à la solution une zone recherche, un contrôleur recherche et une action search().

Invoquez la méthode MessageService::search() depuis l’action search.do.

 Implémentez la vue search.php en présentant les résultats dans une grille de données générée par PHP.

 Testez le résultat.