Bienvenue dans cette première partie du tutorial "Mourrez
tranquille".
Rappelons qu'il fait suite
à cet article qui présente les concepts initiaux. Pour cette fois-ci, nous allons voir comment façonner un
script qui ne s'exécute qu'une seule fois par mois.
Pré-requis :
- Connaissances de base en PHP, possession d'un serveur web (pas forcément dédié) ;
- La gestion des dates en PHP ;
- Les fonctions define(), defined() et file_get_contents().
Rien d'extraordinaire donc, on peut commencer !
Tout d'abord, commençons par les évidences : le script ne fonctionnera que si vous avez au moins un visiteur par jour. Mais pas d'inquiétudes de ce côté-là : même si le site est tout nouveau, rien que les robots des moteurs de recherches suffisent à assurer du trafic. M'enfin, toujours est-il qu'il est plus intéressant de faire cela sur un site connu !
Créez un dossier incaseofdeath/ dans votre site, et placez-y les trois fichiers suivants :
- incaseofdeath.php (nous reviendrons sur le contenu de ce fichier dans les prochaines étapes) ;
- alive.txt (marquez simplement 1 dans ce fichier) ;
- month.txt (marquez 0 dans le fichier) ;
Éditez ensuite avec votre bloc notes préféré un fichier dont vous pouvez assurer qu'il sera chargé chaque jour (le nec plus ultra étant le fichier header.php, ou mieux encore (nec plus plus ultra) le footer.php de votre site afin de ne pas ralentir l'affichage des pages du client), et placez les lignes de code suivantes :
if(date('j')==1) { define('CHECK_DEATH',true); include('incaseofdeath/incaseofdeath.php'); }
Quelques explications ? Si on est le premier du mois (voir l'aide sur la fonction date avec l'option j), on indique que l'on veut explicitement tester notre mort et on charge le fichier incaseofdeath.php. Si l'on omettait le define(), n'importe quelle personne indiquant l'adresse du fichier incaseofdeath.php dans son navigateur pourrait déclencher le script ; et s'il le déclenchait deux fois les mots de passe seraient envoyés puisqu'il est peu probable que vous auriez indiqué votre existence dans le bref laps de temps entre les requêtes.
Fini ? Et non ! Car regardez à nouveau le code : si un autre utilisateur passe le même jour sur votre site, lui aussi va charger le fichier et provoquer le bug décrit plus haut. La solution va être de marquer que le script a été exécuté ce mois-ci pour éviter les multiples appels :
if(date('j')==1 && date('n')!=file_get_contents('incaseofdeath/month.txt') { file_put_contents('incaseofdeath/month.txt',date('n')) define('CHECK_DEATH',true); include('incaseofdeath/incaseofdeath.php'); }
Et voilà, le tour est joué ! Maintenant, le script n'est appelé qu'une fois par mois, enregistre le numéro du mois pour éviter les doublons, et basta ! L'intérêt résidant aussi dans le fait que les accès disques (file_get_contents()) sont minimisés, puisque la seconde partie de la condition n'est effectuée qu'une fois tous les 31 du mois.
Dans la prochaine partie, nous verrons comment remplir notre fichierincaseofdeath.php.