Vous êtes à :
  1. Accueil > 
  2. Nos techniques > 
  3. Tirer partie du PHP
Passer le menu Aller au pied de page

Licences Joueb English version Accessibilité

Le php chez micr0lab

Le HTML est statique : votre page est figée, aucune interaction mais surtout presqu’aucune mutualisation du code n’est possible. Votre menu, vous devez le recopier dans chaque page, adapter les liens s’ils sont relatifs, et surtout corriger toutes les pages à la main en cas de modification. Avec le PHP, vous pouvez afficher des pages HTML gérées dynamiquement : certaines portions du code ne s’affichent qu’en cas de besoin, vous pouvez récupérer le même code pour plusieurs pages, etc. Si vous voulez une explication plus complète, rendez-vous sur open classrooms par exemple.

La grande tendance du moment est de concevoir des sites statiques. Les outils pour fabriquer de tels sites ne manquent pas : HAML, Haml for php, Twig, on peut aussi employer des outils comme gulp (voir ici ou la), il existe aussi des templates et des générateurs de sites employant php. Nous présentons ici quelque chose proche de Sculpin, mais bien plus primitif : nous rédigons nos pages en php, en employant certaines de ses fonctions, puis « compilons » le site en html avec un simple wget.

Bien évidemment, tous les codes et astuces qui suivent sont à employer avec précaution, votre dévoué ouebmestre ne faisant qu’apprendre le php. Tous les codes doivent être encadrés par <?php et ?> pour dire à votre serveur : « voilà du PHP, traite-le comme tel ».

Sommaire : Un chemin relatif automatiqueAfficher une adresse IPAfficher la date de la dernière modificationAfficher la taille d’un fichierAfficher les dimensions d’une imageCalculer l’identiant d’un fichierFabriquer un plan automatiquementUn fil d’ariane automatique et précisCompiler du php vers htmlDebugger son code

 

Le chemin vers la racine

micr0lab utilisait autrefois le script _relpos.php développé par INDEPNET. Un fichier vide nommé siteroot.php placé dans le dossier de votre choix de votre site Internet, et la variable $HTMLRel contenait le chemin relatif vers ce dossier. L’avantage est que vous pouvez choisir où se situe la racine de votre site, l'inconvénient est que le parcours est assez gourmand. Vous pouvez trouver quelques explications sur ce script chez mawel.

Désormais un script plus simple — fonctionnant également en local et sur votre serveur — est employé :

global $local;
$local = ($_SERVER['SERVER_NAME'] == 'localhost');
$ch = pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME);
$cvr = ($ch == '/') ? "" : str_repeat('../' , (substr_count( $ch , '/') -$local));

Deux mots d’explication :

Pour l’emploi, c'est très simple :

Voilà ! L’interêt ? Avoir des chemins relatifs plutôt qu’absolus, pour permettre le développement de votre site sur votre machine (en local), pour l’élégance, pour pouvoir inclure des fichiers php avec toujours le même code, sans avoir à réfléchir à la profondeur de la page.

 

Connaître une adresse I.P.

C’est très simple !

Echo "Votre IP est " . getenv("REMOTE_ADDR");

L’interêt ? Vous montrez que vous vous promenez sur Internet avec une plaque d’immatriculation (voire plusieurs, si on en croît par exemple le Panopticlick de l’Electronic Frontier Foundation). Notez bien que le traçage des navigants évolue vite, notamment avec les third parties trackers. Vous pouvez voir une démonstration (épatante) avec Collusion, et protégez un peu mieux votre vie privée avec des extensions firefox comme ghostery ou Better Privacy.

 

Afficher la date de la dernière modification d’un fichier

C’est également très simple !

echo "Dernière modification : " . date ("d/m/Y", getlastmod());

Et c’est tout ! Dernière modification du présent document : 05/12/2023.

Mais alors si vous savez comment afficher la date de la dernière modification, pourquoi ne pas le faire ?

Nos documents sont édités pour plein de bonnes raisons : remplacer des espaces par des espaces insécables, corriger des typos, mettre à jour un lien, sans que ça ne garantisse la « fraîcheur » de toutes les informations affichées. Ce serait donc trompeur, et inutile : la plupart des pages de ce sites sont intemporelles !

 

Calculer l’identifiant d’un fichier

Le MD5 sert à calculer l’empreinte d’un fichier : c’est un identifiant unique, qu’on appelle également la signature d’un fichier.

Son utilité pour le développement d’un site internet est double : il peut être employé pour qu’un utilisateur s’assure que son téléchargement s’est bien déroulé, mais également pour forcer le re-téléchargement d’une ressource mise en cache qui a changé. C’est de cette seconde façon qu’il est employé ici :

<link rel="stylesheet" href="style.css?<?=md5_file("ecran.css"); ?>" media="screen"/>

En employant ce code, si le fichier style.css est modifié, alors sa signature est également modifiée, et le navigateur le re-charge. Pratique si vous mettez en cache vos fichiers css et que vous n’avez pas envie de les renommer.

 

Afficher la taille d’un fichier

Selon le critère 113 d’Opquast, il convient d’indiquer la taille des fichiers proposés en téléchargement. Mais avec en respectant le Système International d’Unités, s’il vous plaît. En s’inspirant de ce tutoriel, on obtient :

function nom_taille($url){
	$ta=filesize($url);
	if ($ta >= 1073741824)
		{$ta = round($ta / 1073741824 * 100) / 100 . " Gio";}
	elseif ($ta >= 1048576)
		{$ta = round($ta / 1048576 * 100) / 100 . " Mio";}
	elseif ($ta >= 1024)
		{$ta = round($ta / 1024 * 100) / 100 . " Kio";}
	else
		{$ta = $ta . " o";}
	if($ta==0)
		{$ta="-";}
	$url = end(explode('/', $url));
	return "($url, $ta)";
}

Appelez cette fonction, puis pour afficher la taille d’un fichier, entrez simplement :

<a href="../chemin/monfichier.zip <?=nom_taille("../chemin/monfichier.zip"); ?>">Téléchargez !</a>

Pour afficher automatiquement ces informations dans l’autoindex, micr0lab emploie du jQuerry, car il n’est pas possible d’éditer ce champ automatiquement.

 

Afficher les dimensions d’une image

Pour les dimensions d’une image, ce n’est pas très compliqué :

img = 'chemin/de_l_image.png';
$info = getimagesize($img);
printf('<img src="%s" %s>', $img, $info[3]);
 

Un plan (ou plutôt une liste de pages) automatique

Voici le code qui nous permets de générer automatiquement le plan de ce site. Ce code s’inspire de façon très lointaine de LarskoOrg. Une autre façon de faire un plan avec du javascript et du php chez apptools.com.

/* Un tableau avec les repertoires à exclure du parcours.
La syntaxe est : $excludedir[] = "repertoire"; */

/* On exclut les sites hébergés. */
$excludedir[] = "sites";
/* Fin sites hébergés */

/* On exclut les pages "spéciales", qui n’ont aucun intérêt dans le plan. */
$excludedir[] = "403";
$excludedir[] = "404";
$excludedir[] = "images";
/* Fin des exclusions. */

/*Le code mériterait sans doute des explications, peut-être viendront-elles un jour.*/

if($_SERVER['HTTP_HOST'] == 'localhost'){$racine = "/donnees/micr0lab/sites/micr0lab/";}else{$racine = "/homez.541/micrlab/www/";}
function list_dir($chdir) {
	// Variables…
	$cvrdirs = '';
	$prefix='';
	$sdirs='';
	global $racine, $excludedir;
	$cvrdirs = $sdirs;
	unset($sdirs);
	chdir($chdir);
	$handle = opendir('.');
	while ($file = readdir($handle)){
			if (is_file("$file/index.php")){
			if(is_dir($file) && $file != "." && $file != ".." && !in_array($file, $excludedir))
			$sdirs[] = $file;
			}
		}
	$dir = getcwd();
	$dir1 = str_replace($racine, "", $dir."/");
	$count = substr_count($dir1, "/") + substr_count($dir1, "\\");
	if (!empty($sdirs)){sort($sdirs, SORT_STRING);
	reset($sdirs);
	for($y = 0; $y < sizeof($sdirs); $y++) {
		for($z = 2; $z < $count +2 ; $z++)
		$titre_desc = "";
		$titre_desc = titre_desc("$racine$dir1$sdirs[$y]/index.php");
		if(isset($titre_desc[1])){
		echo "
	<h$z><a href=\"../.$prefix/$dir1$sdirs[$y]/\" title=\"$titre_desc[1]\" >$titre_desc[0]</a></h$z>";
}else{
	echo "
		<h$z><a href=\"../.$prefix/$dir1$sdirs[$y]/\">$titre_desc[0]</a></h$z>";
}
		list_dir($dir."/".$sdirs[$y]);
		}
	}
	chdir($chdir);
}

/* Et un coup de récursion pour finir ! */
list_dir($racine);
chdir($racine.'/plan');

Ce code emploi une fonction titre_desc qui est définie ci-dessous.

 

Le fil d’ariane

Le fil d’ariane (breadcrumbs en anglais) est le « vous êtes à… » qui s’affiche en haut de la page. Il y a plein de bonnes raisons de l’afficher et vous en trouverez quelques unes dans cet article. Celui de micr0lab est généré par un script adapté depuis http://www.mindpalette.com/archives/php-breadcrumbs/. Vous pouvez le consulter ci-dessous (bien qu’il n’ait rien d’exceptionnel) en cliquant sur « expand source ».

/*On commence par une fonction pour obtenir titre et description d’une page.*/
function titre_desc($filename){
	$retval = "";
	$handle = fopen($filename, "r");
	$head = fread($handle, 5000);
/*Il faut que le titre et la description soient dans les 5000 premières caractères.*/
	preg_match("<title>(.+)</title>;", $head, $matches);
	if(sizeof($matches) == 2) {
		$retval[0] = substr(trim($matches[1]), 17);
/*On ôte les 17 premiers caractères pour ôter le --::micr0lab::-- qui est présent dans tous les titres.*/
	}
	preg_match(';<meta name="description" content="(.+)"/>;', $head, $matches);
	if(sizeof($matches) == 2) {
		$retval[1] = trim($matches[1]);
	}
	fclose($handle);
	return $retval;
/* $retval est donc un tableau avec en 0 le titre, en 1 la description. */
};

$server = (isset($_SERVER)) ? $_SERVER : $HTTP_SERVER_VARS;

$htmlRoot = (isset($server['DOCUMENT_ROOT'])) ? $server['DOCUMENT_ROOT'] : '';
if ($htmlRoot == '') $htmlRoot = (isset($server['SITE_HTMLROOT'])) ? $server['SITE_HTMLROOT'] : '';

$pagePath = (isset($server['SCRIPT_FILENAME'])) ? $server['SCRIPT_FILENAME'] : '';
if ($pagePath == '') $pagePath = (isset($server['SCRIPT_FILENAME'])) ? $server['SCRIPT_FILENAME'] : '';

$httpPath = ($htmlRoot != '/') ? str_replace($htmlRoot, '', $pagePath) : $pathPath;

$dirArray = explode('/', $httpPath);
if (!is_dir($htmlRoot.$httpPath)) $dirArray = array_slice($dirArray, 0, count($dirArray) - 1);

$linkArray = array();
$thisDir = '';
$linkArray[] = '<a href="$cvr" title="Retour à l’accueil du site.">Accueil</a>';
/* $cvr est une variable propre qui renvoit le chemin relatif vers la racine, voir en haut de la page. */
for ($n=1; $n<count($dirArray); $n++) {
	$thisDir .= $dirArray[$n].'/';
	$index_page = $cvr.$thisDir.'index.php';
/* Attention, dans notre cas toutes les pages portent le nom index.php */
	$titre_desc = titre_desc($index_page);
	$thisLink = ($n == count($dirArray) -1)? $titre_desc[0] :
	'<a href="'.$cvr.$thisDir.'" title="'.$titre_desc[1].'">'.$titre_desc[0].'</a>';
	if ($thisLink != '') $linkArray[$n] = $thisLink;
	};
$results = implode(" > ", $linkArray);
/* Ici, on choisit de séparer chaque entrée par le symbole «&#8239;>&#8239;». */
if ($results != '') print('<p id="vous">Vous êtes à : '.$results.'</p>');
/* On attribue l’ID "vous" à ce paragraphe.*/

Ce code emploi une variable $cvr qui est définie ci-dessus.

 

Compiler du php vers du html

Cependant, fabriquer certaines de ces pages peut être coûteux en terme de calcul pour le serveur. Le plan, par exemple, prend un certain temps a être généré (cf. ci-dessous), un coût bien trop important, surtout qu’il n’y a aucune nécessité de le re-générer à chaque visite, car celui-ci change peu.

Une méthode a donc été conçue pour « compiler » le php vers le html : puisque la page servie n’est pas dépendante de la requête ou de l’utilisateur, autant servir toujours la même. Le php n’est employé ici que comme raccourci, pour inclure ou calculer certaines choses, mais pas pour interagir avec l’utilisateur. Effectuer le calcul sur le poste de production, et servir son résultat à chaque fois, est donc une économie notable. Même en local !

$ time wget http://localhost/micr0lab/plan/index.php -q 0 /tmp/en_php
real 0m0.395s
$ time wget http://localhost/micr0lab/plan/index.html -q 0 /tmp/en_html
real 0m0.053s

La méthode employée est la suivante : une requête en local avec wget sert à obtenir la page servie et la sauvegarde. Cette page html est mis en ligne et servi lors des requêtes à la place de son équivalent en php.

 

Debugger son code php

Insérer ce qui suit dans votre code php:
ini_set("display_errors",1);
error_reporting(E_ALL);

comme conseillé par là.

 

Contact :

Contact Plan Lettre F.a.q. C.G.U.