# Programmation PHP/Redis

* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
[ Modifier le sommaire ]

## Installation

Redis est comme Memcached, un système de gestion de base de données clef-valeur scalable, très hautes performances. En 2019, il devient plus utilisé que Memcached car il possède plus de fonctionnalités. Par exemple il permet en plus une persistance sur la mémoire morte utile pour les reprises sur panne, autoriser les groupes de paires clé-valeur, et gère mieux le parallélisme.

### Serveur

Pour l'installer :
Obtenir la version :

### Client

Sur Docker PHP :
Sur WAMP :
* Télécharger le .dll sur https://pecl.php.net/package/redis
* L'extraire dans le dossier correspondant à la version de PHP. Ex : bin\php\php8.2.0\ext
* L'activer dans php.ini.
* Redémarrer WAMP.
Ensuite on le voit dans phpinfo.

## Commandes

Pour se loguer au serveur Redis :
Les commandes Redis les plus utiles :

### Lecture

* MONITOR : suivre l'activité du serveur en temps réel.
* KEYS * : liste des clés.
* GET : affiche la valeur de la clé en paramètre (ou nil si elle n'existe pas).
* MGET : affiche les valeurs des clés en paramètre.
* QUIT : quitter.

### Écriture

* SET : définit une valeur associée à la clé en paramètre.
* EXPIRE : définit une durée avant expiration pour la clé en paramètre, en secondes.
* SETEX : SET + EXPIRE.
* DEL : supprimer par le nom complet de la clé.
* FLUSHALL : vider toute la base de données.
Exemple de reset mémoire depuis le shell :

## redis-cli

Pour afficher les clés de la base en shell :
Par défaut, redis-cli pointe sur 127.0.0.1. Pour regarder une autre machine :
Supprimer des clés par leurs noms (exemple de celles qui ont le préfixe "users:") :
ou :

## Plusieurs bases

Chaque instance de Redis peut accueillir jusqu'à 16 bases de données.
Elles sont accessibles par un suffixe dans leur DSN. Par défaut, redis://localhost:6379 pointe sur la base zéro : redis://localhost/0:6379.

## Utilisation en PHP
### predis

Cette bibliothèque permet d'utiliser Redis en clustering, avec des masters et slaves.

### Dans Symfony

Dans le framework PHP Symfony.

#### Session
##### SncRedisBundle

Avant Symfony 4.1, il fallait passer par un bundle tel que SncRedisBundle.
Depuis :
Pour que les sessions soient stockées dans Redis au lieu de var/cache/, remplacer dans framework.yaml, session.handler_id: null par snc_redis.session.handler. Cela permet par exemple de les partager entre plusieurs conteneurs.

##### RedisSessionHandler

Depuis Symfony 4.1, le composant HttpFoundation contient une classe RedisSessionHandler.
Installation dans services.yaml :
Puis dans config/packages/framework.yaml :
Ensuite le service session utilisera automatiquement Redis.

#### Doctrine

Pour mettre le cache Doctrine de requête et de résultat dans Redis, on peut utiliser SncRedisBundle.
Pour vider les caches :

#### Cache chainé

L'inconvénient de Redis ainsi configuré est que s'il tombe en panne, les applications qui l'utilisent crashent aussi (erreur de connexion à Redis dès l'instanciation des services).
Pour se prémunir de cela, il est recommandé d'inclure Redis dans un cache chainé, qui permet de basculer automatiquement sur des caches de secours sans bloquer l'application. Exemple :

## Références

* ↑ https://aws.amazon.com/fr/elasticache/redis-vs-memcached/
* ↑ https://www.disko.fr/reflexions/technique/redis-vs-memcached/
* ↑ https://redis.io/commands
* ↑ https://redis.io/commands/set/
* ↑ https://redis.io/commands/setex/
* ↑ https://rdbtools.com/blog/redis-delete-keys-matching-pattern-using-scan/
* ↑ https://www.mikeperham.com/2015/09/24/storing-data-with-redis/
* ↑ https://github.com/predis/predis
* ↑ https://github.com/snc/SncRedisBundle/blob/master/Resources/doc/index.md
* ↑ https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/RedisSessionHandler.php
* ↑ https://symfony.com/doc/current/session/database.html
* ↑ https://kunicmarko20.github.io/2017/07/20/Doctrine-Second-Level-Cache-with-Translations-and-Redis.html
* ↑ https://github.com/snc/SncRedisBundle/issues/554
* ↑ https://symfony.com/doc/current/components/cache/adapters/chain_adapter.html