Corrigé 6
Prérequis
1. |
d. La réponse d correspond le mieux à la définition d’une base NoSQL. Cette famille de bases est conçue pour accompagner les variations de besoins en puissance de calcul ; autrement dit, c’est dans le Cloud que ces bases de données donnent leur pleine mesure. |
2. |
c. La réponse c est la bonne. Le format BSON est un dérivé du format JSON, avec une représentation interne des données en binaire. C’est le choix fait par MongoDB pour représenter des données semi-structurées tout en offrant des possibilités d’indexation pour augmenter les performances et faciliter la recherche d’information. |
3. |
a. La réponse a est correcte. À la différence de gestionnaires de packages comme npm, Composer agit au niveau applicatif, et non au niveau central. Les librairies sont téléchargées dans certaines versions qui dépendent de chaque application. |
4. |
b. La technique du streaming consiste à transférer au fur et à mesure un fichier volumineux. Sans cela, le délai pour commencer à visionner une vidéo serait incompatible avec une expérience utilisateur « en temps réel ». |
Corrigé 6.1 Installer MongoDB et l’extension PHP
Compass est l’utilitaire graphique pour MongoDB. Il sert à créer des bases, des collections et à manipuler par des actions simples les documents dans les collections. Pour se connecter à l’instance par défaut, laissez les paramètres tels quels sur l’écran de connexion :
Pour créer une base de données, il faut indiquer aussi le nom de la première collection :
Dans MongoDB, le schéma n’est pas fixe d’un document à l’autre. Les propriétés sont indiquées à l’insertion du document :
MongoDB stocke les documents au format BSON (Binary JSON). Il est donc logique que l’affichage du résultat de la requête se fasse au format JSON :
Comme beaucoup de serveurs, MongoDB reçoit ses commandes par une API de type service web. Le pilote (driver) réalise la traduction entre les instructions PHP et les appels au service MongoDB. Des versions précompilées du pilote sont disponibles à l’adresse : https://pecl.php.net/package/mongodb
Il faut être très précis dans la sélection du driver à télécharger, selon la version de PHP (par exemple, les packages pour PHP 7.2 et 7.3 ne sont pas interchangeables), le processeur x86 pour...
Corrigé 6.2 Journalisation des discussions
L’action renvoie logiquement un PartialViewResult (c’est-à-dire du contenu au navigateur). Mais ce contenu peut être vide :
public function recordmessage($model) {
return new PartialViewResult("");
}
L’invocation de l’action depuis la vue reprend un pattern déjà appliqué. Le code JavaScript est prédéfini à l’aide de PHP, et son rôle consiste à encoder les paramètres de l’action passés par la query string.
if(isAll == true) {
// général
var message = $('#message').val();
socket.emit('send-message', message);
addmessage(displayname, message, 1);
var sendurl = '<?php html::action_href("messagerie" , "chat", "recordmessage")?>'+
"?attendee=" + encodeURI("Tous") + "&message=" + encodeURI(message);
$.get(sendurl, function (opdata) {
});
$('#message').val('').focus();
} else {
// privé
var message = $('#message').val();
var attendee...
Corrigé 6.3 Enrichissement des messages avec du texte riche
Grâce à la commande Eclipse Import - File system, les fichiers du répertoire summernote-master/dist sont intégrés à la solution :
Cette version n’est pas très respectueuse de la DTD HTML, puisque la balise <link> traîne au milieu de la section <body>. Mais ce n’est que provisoire et les navigateurs s’en accommodent très bien.
<?php //{layout:../_mainLayout.php}?><?php $model=FPLGLobal::$view_result->model; ?>
<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'
});
});
</script>
<div id="richcontent"></div>
Ce qui nous donne à l’essai :...
Corrigé 6.4 Intégrer du contenu multimédia en streaming
Pour éviter de créer deux codes très différents, l’un consacré au fichier et l’autre au BLOB, on tire parti des flux mémoire de PHP. En indiquant php://memory comme nom de fichier, on peut recopier le BLOB dans un flux fichier puis le relire. À part la méthode open(), le reste du code est identique et unique entre les deux sources.
if($this->is_blob)
{
$filename = 'php://memory';
$this->stream = fopen($filename, "w+b");
fwrite($this->stream, $this->blob);
rewind($this->stream);
}
Notre vidéo fait 10 Mo. Il serait délicat de la transférer en une fois du serveur au navigateur.
Ce script ne présente pas de difficulté, toute la gestion du streaming se situe dans la classe LobStream.
<?php
/*
* getstream.php
*/
$content_name = $_REQUEST["content"];
$content_source = $_REQUEST["source"];
require_once 'service/LobStream.php';
$lobs = new LobStream();
if($content_source==="file")
{
$filepath = __DIR__ . "/multimedia/"...
Corrigé 6.5 Stocker et accéder à des données BLOB dans MongoDB
L’interface Compass est utile pour créer les deux collections, aucune propriété particulière n’est à préciser.
La méthode putBlob partage quelques principes de la classe LobStream. Elle utilise les flux en mémoire et le découpage d’un large ensemble de données en morceaux de taille prédéfinie.
public function putBlob($content_name, $content_type, $content_date,
$content_data, $content_length)
{
$client = new \MongoDB\Client("mongodb://localhost:27017");
$video = $client->teamup->video;
$blob = $client->teamup->blob;
$data = base64_encode($content_data);
$filename = 'php://memory';
$stream = fopen($filename, "w+b");
fwrite($stream, $data);
rewind($stream);
$i = 0;
$count = strlen($data);
$blobref = array();
$buffersize = 16000000;
$index = 0;
$chunk_array = array();
while(!feof($stream) && $i <= $count)
{
...
Corrigé 6.6 Rechercher dans les fils de discussion
C’est la partie la plus facile du TP ! Par habitude, la méthode POST est employée, mais un GET fonctionnerait tout aussi bien.
<form class="form-inline my-2 my-lg-0" action=
"recherche-recherche-search.do" method="post">
<input class="form-control mr-sm-2" type="search"
placeholder="Rechercher" aria-label="Rechercher" id="query"
name="query">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit"
name="btnSearch" id="btnSearch">Rechercher</button>
</form>
De façon très cohérente, MongoDB répond par un message JSON. Notez que la création de cet index pour la recherche de texte se fait en ligne de commande plutôt qu’avec l’interface Compass.
MongoDB va découper l’expression recherchée en différents mots. De ce fait, il est aisé de concaténer le nom d’utilisateur à la liste des mots recherchés.
public function search($username, $text)
{
$client = new \MongoDB\Client("mongodb://localhost:27017");
$chat = $client->teamup->chat;
...