I. Introduction▲
Beaucoup d'applications/serveurs web ou de sites internet sont développés de nos jours en PHPHypertext Preprocessor. Mais ces sites contiennent souvent des pages écrites en Perl/CGICommon Gateway Interface afin d'exécuter des calculs ou d'autres tâches plus facilement gérables via ce formidable langage de programmation. Étant donné que les pages utilisent la plupart du temps des sessions afin de protéger la navigation de chaque utilisateur, le besoin se fait ressentir de pouvoir échanger les sessions entre PHPHypertext Preprocessor et Perl.
Cet article va vous expliquer à travers des exemples comment conserver ses variables de session entre ces deux langages.
II. Prérequis▲
Afin de tester convenablement les exemples de cet article, il est nécessaire que vous disposiez des outils adéquats sur votre PC ou serveur.
Bien sûr, vous devez avoir un serveur web comme Apache par exemple, le langage PHP installé, puis évidemment Perl.
Le but de cet article n'étant pas de vous expliquer comment installer ces outils, je considère que tout est déjà bien installé et configuré pour créer et utiliser des pages web PHP, et qu'Apache est bien configuré pour l'utilisation de programmes Perl/CGI.
Si ce n'est pas le cas, je vous recommande vivement de consulter les documentations sur Developpez.com pour procéder à l'installation et à la configuration des outils.
Une fois tout installé, vous constaterez à la lecture de cet article qu'il est nécessaire d'installer certains modules Perl. Si vous ne savez pas le faire, lisez ce tutorielInstallation des modules Perl CPAN, Sous Windows, Linux et Mac OS vous expliquant comment procéder, quel que soit votre système d'exploitation.
III. Exemple de projet▲
L'énoncé de notre projet pour l'élaboration de cet article est le suivant :
Dans un premier temps, nos pages seront en PHP puis l'échange se fera avec Perl.
Notre projet contient une page d'accueil qui nécessite une connexion via un identifiant et un mot de passe. Une fois connecté, nous aurons un message d'accueil nous demandant de cliquer sur un lien afin d'avoir la date du jour. Cette date est donnée par un programme Perl. Ensuite, un lien pointe vers une autre page Perl/CGI qui nous renseigne sur la version de Perl.
Le passage d'une page à l'autre se fait grâce à la session créée depuis la page de connexion PHP. Des vérifications sont faites dans chaque page, sous peine soit d'être redirigé vers la page d'accueil, soit d'avoir une page d'informations.
Dans un second temps, la page d'accueil sera réécrite en Perl et le cheminement sera identique. La session sera ainsi créée par Perl et non PHP, puis les échanges se feront dans le sens Perl → PHP → Perl.
Maintenant, à vos claviers !
IV. PHP vers Perl▲
Dans ce chapitre, nous partons du principe que la session a été créée en PHP et l'échange de données se fait avec Perl.
Nos programmes PHP et notre feuille de style CSS sont dans un répertoire « sessions ». L'URLUniforme Resource Locator utilisée est de type : http://localhost/sessions/.
IV-A. Programmes PHP▲
IV-A-1. Page de connexion : index.php▲
Cette page contient le formulaire de connexion et la première des choses à faire dans notre programme est de créer ou d'ouvrir la session. Je ne vais pas vous expliquer ce qu'est une session. Si vous lisez cet article, c'est que vous le savez !
Pour la création de la session, on utilise la méthode session_start en début de programme.
Un fichier dans lequel on trouvera les variables de session sera créé sur le serveur à l'endroit prévu par le fichier de configuration de PHP (php.ini) :
<?php
session_start();
?>
Étant donné que le lieu de création du fichier de session dépend du serveur web et que nous avons par la suite besoin de le connaître pour un meilleur dialogue avec Perl, nous allons le définir dans notre programme et donner un nom à notre session de la sorte :
<?php
// Lieu de la création de la session
session_save_path('C:\TEMP'
);
// Nom de la session
session_name('SessionPHP'
);
// Création de la session
session_start();
?>
session_save_path lit et/ou modifie le chemin de sauvegarde des sessions.
La méthode session_name permet de modifier le nom de la session courante. Ce nom est utilisé comme nom pour les cookies et les URL. Si vous n'en mettez pas un, celui par défaut sera PHPSESSID.
La méthode session_start() crée une session ou restaure celle trouvée sur le serveur.
Maintenant, définissons le couple identifiant et mot de passe à utiliser pour valider une connexion :
$bon_identifiant
=
'
test
'
;
$bon_motdepasse
=
'
pass
'
;
Pour se connecter à la page, il faudra utiliser ces identifiants.
Déclarons maintenant deux variables contenant les identifiants que taperont les utilisateurs sur notre page, avec un clic sur le bouton « Se connecter » :
// Bouton connexion pressé
$identifiant
=
( isset($_POST
[
'
identifiant
'
]
) ) ?
$_POST
[
'
identifiant
'
]
:
''
;
$motdepasse
=
( isset($_POST
[
'
motdepasse
'
]
) ) ?
$_POST
[
'
motdepasse
'
]
:
''
;
Pour la petite explication, la variable $identifiant contiendra l'identifiant tapé par l'utilisateur et envoyé à la même page via la méthode POST, sinon elle sera égale à une chaîne vide.
Si vous n'avez jamais vu cette écriture, c'est l'équivalent d'un if-else sur une seule ligne via l'opérateur ternaire (« ?: »).
La première ligne pourrait être écrite de la sorte :
if ( isset($_POST
[
'
identifiant
'
]
) ) {
$identifiant
=
$_POST
[
'
identifiant
'
];
}
else {
$identifiant
=
''
;
}
Maintenant, procédons à des tests sur la page.
- Si l'utilisateur a pressé le bouton « Se connecter » et a donné des identifiants erronés :
// Bouton connexion pressé et connexion erronée
if ( isset($_POST
[
'
connexion
'
]
) and ($identifiant
!=
$bon_identifiant
or $motdepasse
!=
$bon_motdepasse
) ) {
$message_erreur
=
"
<p class='erreur center'>Erreur de connexion : identifiant ou mot de passe incorrect</p>
"
;
}
Dans ce cas, on crée une variable contenant un message d'erreur que nous utiliserons par la suite.
- Si l'utilisateur a pressé le bouton « Se connecter » et a donné des identifiants corrects :
// Bouton connexion pressé et connexion correcte
elseif ( isset($_POST
[
'
connexion
'
]
) and ($identifiant
==
$bon_identifiant
&&
$motdepasse
==
$bon_motdepasse
) ) {
$_SESSION
[
"
identifiant
"
]
=
$identifiant
;
header('
Location: http://localhost/sessions/etape1.php
'
);
exit;
}
On redirige l'utilisateur vers le programme PHP suivant via la méthode header. L'utilisation d'exit est juste une sécurité pour ne pas exécuter la suite du programme.
- Si la session est déjà existante et bonne :
// Session déjà existante et bonne
elseif ( isset($_SESSION
[
'
identifiant
'
]
) &&
$_SESSION
[
'
identifiant
'
]
==
$bon_identifiant
) {
header('
Location: http://localhost/sessions/etape1.php
'
);
exit;
}
Idem, redirigeons l'utilisateur.
- Sinon, on affiche le formulaire de connexion :
else {
// Mauvaise session ou bouton connexion non pressé => page normale
}
Dans la suite du programme, affichons le formulaire :
<!
DOCTYPE HTML
>
<html lang
=
"fr"
>
<head>
<meta charset
=
"utf-8"
>
<title>Page d'accueil de connexion PHP</title>
<link href
=
'/sessions/style.css'
type
=
"text/css"
rel
=
"stylesheet"
>
</head>
<body>
<h1 class
=
"center"
>
Accueil</h1>
<p class
=
"center"
>
Merci de vous connecter avec votre identifiant (<i>test</i>
) et votre
mot de passe (<i>pass</i>
).</p>
<form accept
=
"text/html"
method
=
"POST"
accept-charset
=
"utf-8"
action
=
"http://localhost/sessions/index.php"
name
=
"formulaire"
>
<table class
=
"center"
>
<tr>
<td>Identifiant :</td>
<td><input name
=
"identifiant"
type
=
"text"
></td>
</tr>
<tr>
<td>Mot de passe :</td>
<td><input name
=
"motdepasse"
type
=
"password"
></td>
</tr>
<tr>
<td colspan
=
"2"
style
=
"padding-top:20px;text-align:center;"
><input name
=
"connexion"
type
=
"submit"
value
=
"Se
connecter"
>
</td>
</tr>
</table>
</form>
<?php
if ( ! empty($message_erreur) ) { echo $message_erreur; }
?>
</body>
</html>
C'est du code classique en HTML avec le doctype HTML5 (même si cela n'a aucune importance). Après la balise de fin </form>, nous affichons le message d'erreur d'identification si nécessaire.
Le programme complet index.php est le suivant :
Voici un exemple de capture d'écran :
IV-A-2. Étape 1 : etape1.php▲
Dans cette page, nous allons afficher l'identifiant, mettre un lien de déconnexion et un lien qui pointe vers le programme Perl pour afficher la date et l'heure.
Comme pour toutes les pages PHP, nous allons ouvrir les sessions et tester si la variable de session stockant l'identifiant est présente ; sinon, on redirige l'utilisateur vers la page d'accueil.
Ensuite, on affiche le contenu de la page :
<?php
// Lieu de la création de la session
session_save_path('C:\TEMP'
);
// Nom de la session
session_name('SessionPHP'
);
// Création de la session
session_start();
// Vérification de la session
if
( isset($_SESSION
[
"identifiant"
]
) and
($_SESSION
[
"identifiant"
]
==
"test"
) ) {
// OK
}
else
{
header('Location: http://localhost/sessions/index.php'
);
exit;
}
?>
<!
DOCTYPE HTML>
<
html lang=
"
fr
"
>
<
head>
<
meta charset=
"
utf-8
"
>
<
title>
PHP :
&
Eacute;
tape 1
</
title>
<
link href=
'
/sessions/style.css
'
type=
"
text/css
"
rel=
"
stylesheet
"
>
</
head>
<
body>
<
h1 class=
"
center
"
>
Accueil -
&
eacute;
tape 1
</
h1>
<
div class=
"
deconnexion
"
><
a href=
"
/sessions/deconnexion.php
"
>
Se d&
eacute;
connecter</
a></
div>
<
p>
Bonjour <
b>
<?php
echo $_SESSION
[
"identifiant"
];
?>
</
b><
br>
Demandons &
agrave;
Perl la date du jour :
<
a href=
"
http://localhost/cgi-bin/date.pl
"
>
ici</
a>.
<
hr>
Variable session :
<?php
print_r($_SESSION
);
?>
</
body>
</
html>
On notera que l'on affiche le contenu de la session. Cela permettra d'afficher les variations si besoin :
Variable session :
<?php
print_r($_SESSION
);
?>
IV-A-3. Programme de déconnexion▲
Ce programme deconnexion.php permet d'ouvrir la session et de la détruire. Puis l'utilisateur est redirigé vers la page d'accueil :
<?php
session_save_path('C:\TEMP'
);
session_name('SessionPHP'
);
session_start();
// Détruit toutes les variables de session
$_SESSION
=
array
();
// Destruction de la session : manière simple
session_destroy();
// Redirection en page d'accueil
header('Refresh: 2; http://localhost/sessions/index.php'
);
?>
<!
DOCTYPE HTML>
<
html lang=
"
fr
"
>
<
head>
<
meta charset=
"
utf-8
"
>
<
title>
Deconnexion PHP</
title>
<
link href=
'
/sessions/style.css
'
type=
"
text/css
"
rel=
"
stylesheet
"
>
</
head>
<
body>
<
h1 class=
"
center
"
>
Déconnexion en cours...</
h1>
</
body>
</
html>
La destruction de la session entraîne la suppression des variables de session. Ainsi, le fichier sess_xxxxx qui est dans le répertoire C:\Temp sera vidé mais pas supprimé. Si vous souhaitez que le fichier soit réellement supprimé, cela dépend de la configuration de PHP (il faut activer le garbage collector). Dans le fichier php.ini, il faut décommenter et définir la variable session.gc_probabilityà 1.
Ou bien, dans le programme PHP de déconnexion, mettre : ini_set('session.gc_probability', '1');
IV-A-4. Rappel sur les sessions PHP▲
Dès la session démarrée avec session_start, et jusqu'à sa fermeture (typiquement la fin d'exécution du script), PHP pose un verrou exclusif en écriture sur le fichier de session. Durant l'exécution du script, tout processus ayant besoin d'accéder aux variables de session devra attendre que ce verrou soit libéré. En cas de traitement lourd, on peut avoir un blocage suivi d'une erreur de timeout des autres processus cherchant à y accéder.
Dans ce cas de figure, il est recommandé de relâcher manuellement ce verrou par un appel à la méthode session_write_close.
N'hésitez pas à vous documenter, il existe de très bons articles sur ce sujet.
IV-B. Programme Perl▲
IV-B-1. Programme d'affichage de la date : date.pl▲
La propagation des sessions se fait en PHP via deux méthodes : par cookies et par URL. La première est celle que nous avons utilisée dans les exemples ci-dessus.
Pour que Perl puisse récupérer la session en cours, il va devoir lire le cookie généré par le programme PHP. Commençons l'écriture de notre programme.
Le but de notre programme est basique : afficher la date. Nous allons le faire via le module POSIX. Inutile de chercher à l'installer, il est déjà présent dans le Core de Perl :
#!C:/perl/bin/perl.exe
use warnings;
use strict;
use POSIX qw(strftime)
;
# Date et heure
my $date
=
strftime "
%d
/
%m
/
%Y
%H
:
%M
:
%S
"
, localtime
;
Cela affichera une date de ce type : 23/10/2012 22:01:52
Déclaronsmaintenant deux variables contenant le nom de la session et le répertoire où elle est stockée :
# Nom de la session et répertoire où sont stockés les fichiers de session.
my $nom_session
=
'SessionPHP'
;
my $repertoire_session
=
'C:\TEMP'
;
Il est maintenant important de récupérer l'identifiant du cookie. Pour cela, nous devons d'abord créer le constructeur CGI qui permet de créer une page web en Perl. Pour cela, il faudra faire appel au module CGI (qui doit être installé sur votre serveur). Je vous recommande également d'installer le module CGI::Carp utile en cas de besoin de débogage. Il permet d'afficher les messages d'erreurs sur la page web afin de ne pas toujours aller voir dans le fichier log.
Pensez à ne plus faire appel au module CGI::Carp dans vos programmes en production.
Ensuite, on récupère le cookie :
# Cookie
my $cookie
=
$cgi-
>
cookie( -
name =>
$nom_session
);
Il est important de s'assurer que le cookie existe bien et que la session est bien existante, sinon, il ne s'agit pas d'un utilisateur étant passé par le formulaire de connexion vu précédemment. Pour vérifier que la session est existante, il faut tout simplement vérifier qu'un fichier se nommant sess_IDCOOKIE est présent dans le répertoire de sessions :
# Vérifions l'existence de la session et du cookie
if ( (not
defined
$cookie
) or
(!
-
e $fichier_session
) ) {
redirection($cgi
);
}
sub redirection {
my $cgi
=
shift
;
print
$cgi-
>
header(
-
charset =>
'utf-8'
,
-
Refresh =>
'4; URL=http://localhost/sessions/index.php'
,
);
print
$cgi-
>
start_html(
-
title =>
"Perl - Etape 2 : interdiction"
,
-
style =>
{
'src'
=>
'/sessions/style.css'
}
,
);
print
"<p class='erreur center'>La session <b>
$nom_session
</b> est inconnue ou
vous n'avez pas le droit de lire cette page.</p>"
;
print
"<p class='center'>Redirection dans quatre secondes.</p>"
;
print
$cgi-
>
end_html;
exit;
}
Si le cookie n'existe pas ou si le fichier de session n'existe pas, une redirection est effectuée au bout de quatre secondes. Une procédure de redirection a été créée car elle sera utilisée au moins deux fois dans le programme.
Maintenant, créons la session et/ou assurons-nous que l'identifiant est le bon. Nous aurons besoin du PHP::Sessionqui permet de lire ou créer une session :
use PHP::Session;
# Lecture ou création de la session
my $session
=
PHP::Session->
new( $cookie
,
{
save_path =>
$repertoire_session
,
auto_save =>
1
, # Sauvegarde de la session en cas de modification
create =>
1
,
}
);
# Variable de session identifiant
my $identifiant
=
$session-
>
get('identifiant'
);
if ( not
defined
$identifiant
or
$identifiant
ne
'test'
) {
redirection($cgi
);
}
À ce stade, tous les tests ont été effectués, nous pouvons afficher la page. En affichant l'id de la session, la date, puis en mettant un lien qui pointe vers une autre page Perl affichant la version de Perl. De plus, on stockera la date dans la session :
print
$cgi-
>
header( -
charset =>
'utf-8'
, );
print
$cgi-
>
start_html(
-
title =>
'Perl - Etape 2 : date'
,
-
style =>
{
'src'
=>
'/sessions/style.css'
}
,
);
my $id
=
$session-
>
id;
$session-
>
set( date =>
$date
);
print
'<h1 class="center">Perl - Étape 2 </h1>'
;
print
'<div class="deconnexion"><a href="/sessions/deconnexion.php">Se déconnecter</a></div>'
;
print
<<"RESUME";
Bonjour <b>
$identifiant
</b>, aujourd'hui, nous sommes le :
$date
<br><br>
Cookie : <b>
$cookie
</b><br>
Id session : <b>
$id
</b><br><br>
Perl, affiche ma version : <a href="/cgi-bin/version-perl.pl">ici</a>
RESUME
print
$cgi-
>
end_html;
Voici le programme complet :
IV-B-2. Programme version-perl.pl▲
Le programme est semblable à date.pl. Seul le contenu affiché de la page change car on affiche la version de Perl. Voici le programme :
On fait appel au module interne de Perl English (perlvar) qui nous permet d'utiliser la variable spéciale $PERL_VERSION.
V. Perl vers PHP▲
Essayons maintenant de créer de novo une session depuis un programme Perl et l'échanger avec un programme PHP. Pour cela, nous allons reproduire la page d'accueil index.php vue ci-dessus en Perl.
V-A. Programme accueil.pl▲
Le programme est assez simple si vous avez bien suivi les premiers chapitres de cet article. Le voici et nous le commenterons par la suite :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
#!C:/perl/bin/perl.exe
use warnings;
use strict;
use CGI;
use CGI::Carp 'fatalsToBrowser'
;
use File::Spec;
use PHP::Session;
# Nom de la session et répertoire où sont stockés les fichiers de session.
my $nom_session
=
'SessionPHP'
;
my $repertoire_session
=
'C:\TEMP'
;
my $cgi
=
new CGI;
# Cookie
my $cookie
=
$cgi-
>
cookie( -
name =>
$nom_session
);
my $fichier_session
=
File::Spec->
catfile( $repertoire_session
, 'sess_'
. $cookie
);
# Lecture ou création de la session
my $session
=
PHP::Session->
new(
$cookie
,
{
save_path =>
$repertoire_session
,
auto_save =>
1
,
create =>
1
,
}
);
my $bon_identifiant
=
'test'
;
my $bon_motdepasse
=
'pass'
;
# Bouton connexion pressé
my $identifiant
=
$cgi-
>
param('identifiant'
);
my $motdepasse
=
$cgi-
>
param('motdepasse'
);
my $message_erreur
=
''
;
# Bouton connexion pressé et connexion erronée
if ( $cgi-
>
request_method() eq 'POST'
and
$cgi-
>
param('connexion'
)
and
( $identifiant
ne
'test'
or
$motdepasse
ne
'pass'
) )
{
$message_erreur
=
"<p class='erreur center'>Erreur de connexion : identifiant ou mot de passe incorrect</p>"
;
}
# Bouton connexion pressé et connexion correcte
elsif ( $cgi-
>
request_method() eq 'POST'
and
$cgi-
>
param('connexion'
)
and
( $identifiant
eq 'test'
or
$motdepasse
eq 'pass'
) )
{
$session-
>
set( identifiant =>
$identifiant
);
print
$cgi-
>
redirect('http://localhost/sessions/etape1.php'
);
exit;
}
# Session déjà existante et bonne
elsif ( $session-
>
get('identifiant'
) and
$session-
>
get('identifiant'
) eq $bon_identifiant
) {
print
$cgi-
>
redirect('http://localhost/sessions/etape1.php'
);
exit;
}
else {
# Mauvaise session ou bouton connexion non pressé => page normale
}
print
$cgi-
>
header( -
charset =>
'utf-8'
, -
lang =>
'fr'
);
print
$cgi-
>
start_html(
-
title =>
"Page d'accueil de connexion Perl"
,
-
style =>
{
'src'
=>
'/sessions/style.css'
}
,
);
print
<<"RESUME";
<h1 class="center">Accueil</h1>
<p class="center">Merci de vous connecter avec votre identifiant (<i>test</i>) et votre
mot de passe (<i>pass</i>).</p>
<form accept="text/html" method="POST" accept-charset="utf-8" action="accueil.pl" name="formulaire">
<table class="center">
<tr>
<td>Identifiant :</td>
<td><input name="identifiant" type="text"></td>
</tr>
<tr>
<td>Mot de passe :</td>
<td><input name="motdepasse" type="password"></td>
</tr>
<tr>
<td colspan="2" style="padding-top:20px;text-align:center;">
<input name="connexion" type="submit" value="Se connecter">
</td>
</tr>
</table>
</form>
RESUME
if ( defined
$message_erreur
) {
print
$message_erreur
; }
print
$cgi-
>
end_html;
Ce script utilise les mêmes principes que dans les programmes Perl ci-dessus. Pour créer les sessions on utilise le module PHP::Session.
Dans un premier temps en ligne 16, on essaye de récupérer l'id de la session si celle-ci existe. En ligne 19, on stocke la session ou on la crée si le cookie est à undef (l'attribut create permet la création si besoin).
De la ligne 27 à 62, nous vérifions si le bouton « Se connecter » a été pressé, si les identifiant et mot de passe saisis sont corrects et surtout si les informations ont été transférées avec la méthode POST. Ou bien, on vérifie que la variable de session est déjà bien présente.
Si tout est OK, on se redirige vers la page PHP (etape1.php), sinon, on crée une variable contenant le message d'erreur de connexion.
Par la suite, nous avons le code HTML nécessaire à la création du formulaire de connexion.
Une fois à la page PHP etape1.php, le cheminement est celui décrit dans la première partie de cet article. Les sessions sont très bien conservées entre Perl et PHP.
VI. Conclusion▲
Cet article nous a permis de constater qu'il est assez simple de faire communiquer des pages web écrites en PHP et en Perl à travers des sessions. De plus, nous avons l'habitude de concevoir des pages web en PHP et de créer des sessions, mais nous avons vu que la session peut être créée en Perl puis échangée avec PHP. Dans tous les cas, la communication est possible grâce au module PHP::Session. Sachez qu'il existe également le module CGI::Session et bien d'autres pour la création de sessions.
Bien évidemment, les sessions ne sont pas faites pour que l'on y stocke des mots de passe, même si c'est possible. Pour cela, vous pouvez tout à fait coupler le tout à une base de données.
L'article a traité le cas d'échanges via des sessions et cookies, mais si les navigateurs bloquent ces popups, il est possible de passer les id des sessions via les URL. Pour en savoir plus, consultez les documentations PHP à ce sujet et celles des modules cités ci-dessus.
VII. Liens utiles et programmes à télécharger▲
Voici la liste des liens utiles de cet article :
- installation des modules Perl CPAN ;
- cours Apache ;
- cours PHP ;
- installer Perl ;
- les sessions PHP ;
- modules Perl : CGI, PHP::Session, CGI::Session, English (perlvar).
Pour tester les programmes de cet article, voici un répertoire contenant les programmes PHP. Le répertoire est à déposer dans votre répertoire www. Voici maintenant les programmes Perl/CGI à déposer dans votre répertoire cgi-bin. Les répertoires www et cgi-bin sont les répertoires par défaut, mais tout dépend de la configuration de votre serveur web.
VIII. Remerciements▲
Je tiens à remercier jreaux62 pour la relecture de cet article. Un remerciement aux éclairages de GrandFather sur les rappels des sessions, sans oublier ClaudeLELOUP et _MAX_ pour le regard avisé.