Files
varlog/_cache/search/8f62c3bb23e35620d8df1f540c406f1f.json
T
2026-05-15 10:37:48 +02:00

1 line
21 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[{"article":{"uuid":"8ed45b6e-d89b-4ae9-94e2-ed8476c00080","slug":"creer-son-propre-mini-framework-php-from-scratch","title":"Créer son propre mini-framework PHP from scratch","category":"informatique","author":"cedric@abonnel.fr","cover":"","published":true,"published_at":"2025-11-04 22:07:52","created_at":"2025-11-04 22:07:52","updated_at":"2025-11-04 22:07:52","plain":"Tout commence avec une idée simple : bâtir un système web léger, modulaire et compréhensible, sans dépendre dun framework externe.\r\nUn framework maison, conçu pour gérer efficacement des posts, des commentaires et des pièces jointes, tout en respectant les principes de larchitecture MVC.\r\n\r\nLobjectif\r\n\r\nDisposer dune base claire et extensible, où chaque brique du système — du routeur aux modèles — reste transparente et entièrement maîtrisable.\r\n--\r\n\r\nLa structure du projet\r\n\r\nLapplication sorganise autour dune arborescence simple et logique.\r\n\r\nAu sommet, le dossier joue le rôle de porte dentrée du site, avec un fichier qui orchestre tout : cest lui qui intercepte chaque requête et la transmet au routeur.\r\n\r\nDans le dossier , on retrouve le cœur de la logique métier :\r\n\r\n contient les fondations : le routeur et la classe de base des contrôleurs.\r\n regroupe les différentes logiques daction (posts, commentaires, pièces jointes).\r\n gère la persistance des données — ici stockées dans des fichiers JSON pour plus de simplicité.\r\n\r\nChaque couche a un rôle précis, et lensemble reste clair, modulaire et facile à maintenir.\r\n--\r\n\r\nLe routeur : le cerveau du système\r\n\r\nAu cœur du projet, le fichier agit comme un chef dorchestre.\r\nIl écoute les requêtes entrantes, analyse leur méthode (, , , etc.) et les fait correspondre à la bonne route.\r\n\r\nGrâce à un jeu de regex, le routeur reconnaît des chemins dynamiques comme et transmet automatiquement les paramètres au contrôleur concerné.\r\nUne architecture élégante, minimaliste et pourtant très puissante.\r\n--\r\n\r\nLentrée principale : \r\n\r\nTout commence dans .\r\nAprès avoir chargé les classes nécessaires, on y définit les routes — une à une — comme les règles dun jeu.\r\n\r\nChaque route associe une méthode HTTP à une action précise :\r\n\r\n Afficher tous les posts\r\n Créer un nouveau post\r\n Mettre à jour, publier ou masquer un post\r\n Ajouter un commentaire ou une pièce jointe\r\n\r\nUne fois toutes les routes enregistrées, le routeur intercepte la requête HTTP réelle et la redirige vers le bon contrôleur.\r\nCest simple, direct et parfaitement lisible.\r\n--\r\n\r\nLes contrôleurs : la logique métier\r\n\r\nPrenons comme exemple.\r\nChaque méthode correspond à une action concrète du système : afficher la liste des posts, en créer un, le modifier, le publier ou le masquer.\r\n\r\nLes contrôleurs sont stateless : ils reçoivent les données, invoquent le modèle correspondant, puis renvoient une réponse JSON propre et explicite.\r\nAucune dépendance superflue, aucun artifice — le code parle de lui-même.\r\n--\r\n\r\nLes modèles : la mémoire du système\r\n\r\nLes modèles (, , ) assurent la gestion des données.\r\nIci, les informations sont stockées dans des fichiers JSON — un choix volontairement simple, idéal pour le prototypage ou les petits projets.\r\n\r\nMais la structure est pensée pour pouvoir évoluer facilement vers une base de données réelle (MySQL, SQLite, etc.) via PDO.\r\nChaque modèle sait comment lire, créer, modifier et sauvegarder ses propres objets, garantissant ainsi une séparation claire des responsabilités.\r\n--\r\n\r\nUne API claire et RESTful\r\n\r\nLes routes suivent une logique RESTful, simple et cohérente :\r\n\r\n\r\n\r\nLAPI est lisible, homogène et prête à être consommée par nimporte quel front-end — quil soit en Vue.js, React, ou même une interface HTML minimale.\r\n--\r\n\r\nPourquoi cette approche séduit\r\n\r\nCe mini-framework maison présente plusieurs atouts :\r\n\r\n Zéro dépendance externe : tout est sous ton contrôle.\r\n Architecture claire et didactique : parfaite pour comprendre la mécanique interne dun framework.\r\n Routing dynamique et élégant : les paramètres dURL sont gérés naturellement.\r\n Extensibilité : tu peux facilement ajouter lauthentification, des middlewares ou la validation des données.\r\n Légèreté : un cœur minimal, mais robuste et fonctionnel.\r\n--\r\n\r\nEt après ?\r\n\r\nLa prochaine étape : implémenter la gestion complète des fichiers uploadés, avec vérification du type MIME, stockage sécurisé dans , et possibilité de masquer les pièces jointes à la demande.\r\n\r\nPetit à petit, ton framework prend forme — un système MVC léger, propre et totalement maîtrisé.\r\nTu nutilises plus un framework : tu en construis un."},"score":1.75,"snippet":"…a persistance des données — ici stockées dans des fichiers <mark>JS</mark>ON pour plus de simplicité.\r\n\r\nChaque couche a un rôle précis, et lensemble reste clair, modulaire et facile à maintenir.\r\n--\r\n\r\nLe routeur : le cerveau du sy…","tier":2},{"article":{"uuid":"14881210-68fb-412e-9900-55d2e39ec241","slug":"structure-des-dossiers-d-un-projet-php","title":"Programmer un site Internet en PHP","category":"Informatique","author":"cedric@abonnel.fr","cover":"","published":true,"published_at":"2023-12-26 19:50:41","created_at":"2023-12-26 19:50:41","updated_at":"2023-12-26 19:50:41","plain":"Avertissements\nBien que Composer soit un outil puissant pour les dépendances et les classes externes, certaines personnes préfèrent toujours créer leurs propres classes pour des raisons telles que :\nContrôle sur le code : En créant ses propres classes, on peut contrôler le code source et le personnaliser pour répondre à ses besoins spécifiques.\nMeilleure compréhension : En créant ses propres classes, on peut mieux comprendre comment elles fonctionnent et les adapter à ses propres projets.\nPrise en charge des anciens projets : Si on a déjà utilisé ses propres classes pour la gestion de la base de données ou d'autres tâches dans d'autres projets, il peut être plus facile de les utiliser dans un nouveau projet plutôt que d'adopter un nouvel outil.\nExigences personnalisées : Certaines personnes peuvent avoir des exigences spécifiques qui ne sont pas prises en charge par les bibliothèques externes existantes. La création de leurs propres classes leur permet de satisfaire ces besoins. Le choix entre l'utilisation de Composer et la création de ses propres classes dépend des besoins et des préférences individuelles. en cours de rédaction Structure des dossiers d un projet php\nDans la plupart des cas, il est recommandé de créer un dossier public pour séparer les fichiers publics du code source. Le dossier public devrait contenir les fichiers accessibles directement via un navigateur web, tels que les fichiers HTML, JavaScript, CSS et images. Les autres fichiers, tels que les classes PHP, les fichiers de configuration et les fichiers d'enregistrement, devraient être placés dans un dossier séparé pour une meilleure sécurité. Pour structurer un projet PHP avec des classes, JavaScript et CSS, voici une structure de dossiers suggérée : Dans un projet PHP, les dossiers classes, css et js peuvent être utilisés pour organiser les fichiers associés à ces technologies.\n: ce dossier peut contenir toutes les classes PHP utilisées pour la logique de l'application.\n: ce dossier peut contenir tous les fichiers CSS pour la mise en forme de l'interface utilisateur.\n: ce dossier peut contenir tous les fichiers JavaScript pour la logique client-side et l'interaction utilisateur.\n: ce dossier devrait être placé dans le dossier public pour être accessible directement via un navigateur web. Il contient les images. Il est courant de placer les fichiers de configuration dans un dossier nommé et les fichiers d'enregistrement dans un dossier nommé . Cependant, la structure de dossiers dépend fortement des besoins spécifiques de chaque projet, il n'y a donc pas de solution universelle. Il est important de choisir une structure de dossiers qui facilite la maintenance et la compréhension de votre projet pour vous et les autres développeurs qui peuvent travailler dessus. Créer un autoloader pour les classes\nUn autoloader est une fonction en PHP qui charge automatiquement les classes nécessaires à l'exécution du code. Vous pouvez créer un autoloader en définissant une fonction qui inclura le fichier associé à une classe spécifique lorsque cette classe est utilisée pour la première fois. Voici un exemple d'implémentation d'un web/autoload : Cet exemple utilise la fonction de PHP pour définir l'autoloader. La fonction accepte une fonction anonyme qui sera appelée chaque fois qu'une classe non trouvée sera utilisée. La fonction anonyme convertit le nom de la classe en un nom de fichier en remplaçant les antislashs (\\) par des slashs (/) et ajoute l'extension pour former le nom du fichier associé à la classe. Enfin, le fichier associé est inclu en utilisant précédé du chemin pour accéder au classes (). Ce code suppose que les noms de classes correspondent aux noms de fichiers et que les classes sont rangées dans des dossiers hiérarchiques correspondant à leur namespace. Il peut être nécessaire de personnaliser cette implémentation en fonction de la structure de dossiers de votre projet. Créer un fichier de configuration\nCréer des fichiers de log\nCréer une connexion à la base de données"},"score":1.75,"snippet":"…autres fichiers, tels que les classes PHP, les fichiers de <mark>config</mark>uration et les fichiers d&#039;enregistrement, devraient être placés dans un dossier séparé pour une meilleure sécurité. Pour structurer un projet PHP avec des…","tier":2},{"article":{"uuid":"db954e16-6ca3-414f-92a8-0be0694c8301","slug":"etherpad","title":"etherpad","category":"Informatique","author":"cedric@abonnel.fr","cover":"","published":true,"published_at":"2023-02-10 22:48:30","created_at":"2023-02-10 22:48:30","updated_at":"2023-02-10 22:48:30","plain":"Etherpad est un éditeur de texte libre en ligne fonctionnant en mode collaboratif et en temps réel. Les utilisateurs se connectent au service avec un navigateur compatible Javascript. Tous les utilisateurs connectés au même document (appelé PAD) observent en temps réel les modifications des autres utilisateurs. Le site Web du projet est https:etherpad.org/ Installer le service etherpad\nLe service etherpad fonctionne avec Node.js. Mise à jour de la liste des paquets\n\\\\\n · Avant toutes choses, mettez à jour vos listes de dépôt avec le gestionnaire de paquet apt, en tapant cette commande : Installer Node.js\nPour installer Node.js sur une distribution Debian ou Ubuntu, vous pouvez suivre ces étapes : \\\\\n · Ajoutez la clé GPG pour le dépôt de Node.js : ou \\\\\n · Installez Node.js en utilisant le gestionnaire de paquets apt : Installer etherpad\n\\\\\n· Créer le répertoire : \\\\\n· Cloner le projet initial : \\\\\n· Donner les bonnes permissions au répertoire : \\\\\n· Cloner le projet initial : Créer le service etherpad\nVous pouvez créer un service système pour Etherpad, de sorte qu'il démarre automatiquement avec le système et qu'il soit géré par les commandes standard de gestion des services. Pour écrire un service systemd pour Etherpad, vous pouvez suivre ces étapes : \\\\\n· Créez un fichier de service dans le répertoire /etc/systemd/system/ avec un nom approprié, par exemple . Utilisez un éditeur de texte pour éditer ce fichier. \\\\\n· Ajoutez les informations de service suivantes dans le fichier : \\\\\n· Rechargez les configurations systemd pour prendre en compte les nouveaux changements : \\\\\n · Activez et démarrez le service Etherpad : \\\\\n · Vérifiez l'état du service et les journaux d'erreurs : En utilisant ce fichier de service, votre Etherpad démarrera automatiquement au démarrage de votre système et sera géré par les commandes standard de gestion des services de systemd**."},"score":1.75,"snippet":"…s de service suivantes dans le fichier : \\\\\n· Rechargez les <mark>config</mark>urations systemd pour prendre en compte les nouveaux changements : \\\\\n · Activez et démarrez le service Etherpad : \\\\\n · Vérifiez l&#039;état du service et les…","tier":2},{"article":{"uuid":"76fc5149-691d-41ab-adfe-12f08f473cd1","slug":"install-lutim","title":"Installer Lutim","category":"Informatique","author":"cedric@abonnel.fr","cover":"","published":true,"published_at":"2023-02-09 16:12:18","created_at":"2023-02-09 16:12:18","updated_at":"2023-02-09 16:12:18","plain":"Lutim est codé en Perl, pour le faire fonctionner il est nécessaire dinstaller Carton, un gestionnaire de modules Perl. Pour créer les aperçus des images après upload, il est nécessaire dinstaller le logiciel ImageMagick et le module Perl qui correspond. Créez un compte utilisateur ainsi que le dossier ou dans lequel seront copiés les fichiers avec les droits daccès correspondants. Téléchargez les fichiers de la dernière version sur le dépôt officiel (« Download zip » en bas à droite ou bien en ligne de commande avec git), copiez son contenu dans le dossier /var/www/lutim et attribuez les droits des fichiers à lutilisateur lutim Connectez-vous avec lutilisateur lutim : et lancez la commande dinstallation des dépendances depuis le dossier Maintenant que tout est prêt, modifiez le fichier de configuration de Lutim lutim.conf avec votre éditeur de texte préféré sur le modèle du fichier lutim.conf.template. Par défaut le logiciel est configuré pour écouter sur le port 8080 de ladresse 127.0.0.1 (localhost) et avec lutilisateur www-data quil faut donc ici remplacer par lutim cp lutim.conf.template lutim.conf\nvim lutim.conf Lensemble des paramètres sont facultatifs à lexception du paramètre contact (pensez bien à le configurer et à le décommenter) mais il peut être utile de chiffrer systématiquement les images : alwaysencrypt => 1\nLutim en tant que service À présent, le serveur tournera lorsque quon lancera en tant que root cette commande : carton exec hypnotoad script/lutim Pour éviter de devoir relancer le serveur à la main à chaque redémarrage du serveur, on va donc lancer Lutim sous forme de service. Il faut pour ça copier le script utilities/lutim.init dans le fichier /etc/init.d/lutim, le rendre exécutable puis copier le fichier utilities/lutim.default dans /etc/default/lutim. cp utilities/lutim.init /etc/init.d/lutim\ncp utilities/lutim.default /etc/default/lutim Il faut maintenant modifier /etc/default/lutim pour y mettre le chemin dinstallation de notre Lutim (/var/www/lutim si vous navez pas changé le chemin préconisé par ce tutoriel) vim /etc/default/lutim\nchmod +x /etc/init.d/lutim\nchown root:root /etc/init.d/lutim /etc/default/lutim 4 Pailler À ce stade, si tout sest bien passé, lorsque vous exécutez la commande service lutim start, Lutim est pleinement fonctionnel. Vous navez qu’à vous rendre sur lURL http:127.0.0.1:8080 pour pouvoir lutiliser. Nous allons maintenant configurer Lutim pour le rendre accessible depuis un nom de domaine avec Nginx (vous pouvez également utiliser Apache ou Varnish puisque seule la fonctionnalité de proxy inverse nous intéresse).\nNginx Installez le paquet : apt-get install nginx Créez le fichier de configuration de votre domaine /etc/nginx/sites-available/votre-nom-de-domaine pour y mettre ceci (en remplaçant « votre-nom-de-domaine ») et le port 8080 si vous lavez changé dans la configuration de Lutim : server {\n listen 80 ; servername votre-nom-de-domaine ; \n root /var/www/lutim/public ; # Important pour la confidentialité des utilisateurs\n accesslog off ;\n errorlog /var/log/nginx/lutim.error.log ; # Paramètre important ! À adapter en fonction de la configuration de Lutim\n clientmaxbodysize 40M ; location ^/(img|css|font|js)/ {\n tryfiles $uri @lutim ;\n addheader Expires \"Thu, 31 Dec 2037 23:55:55 GMT\" ;\n addheader Cache-Control \"public, max-age=315360000\" ;\n } location / {\n tryfiles $uri @lutim ;\n } location @lutim {\n proxypass http:127.0.0.1:8080 ;\n proxysetheader Host $host ;\n proxysetheader X-Real-IP $remoteaddr ;\n proxysetheader X-Forwarded-For $proxyaddxforwardedfor ;\n proxysetheader X-Remote-Port $remoteport ;\n proxyredirect off ;\n }\n} Activez votre fichier : ln -s /etc/nginx/sites-available/votre-nom-de-domaine /etc/nginx/sites-enabled/votre-nom-de-domaine Enfin, relancez nginx : service restart nginx\n5 Tailler et désherber La personnalisation de votre instance de Lutim passe par l’édition à la main des fichiers css, images et javascript qui se trouvent dans le dossier public et des fichiers du dossier templates ou public pour les fichiers statiques.. Les fichiers de langues se trouvent dans le dossier lib/Lutim/I18N. Pour pouvoir personnaliser et observer vos modifications en direct, il vous faudra stopper temporairement le service service lutim stop et le démarrer avec la commande : carton exec morbo script/lutim Le serveur écoutera alors sur http:*127.0.0.1:3000 mais vous pouvez le faire écouter sur le même port quavec hypnotoad pour continuer à passer par Nginx pendant votre développement : carton exec morbo script/lutim --listen=http://127.0.0.1:8080"},"score":1.75,"snippet":"…ssier Maintenant que tout est prêt, modifiez le fichier de <mark>config</mark>uration de Lutim lutim.conf avec votre éditeur de texte préféré sur le modèle du fichier lutim.conf.template. Par défaut le logiciel est <mark>config</mark>uré pour éc…","tier":2},{"article":{"uuid":"ce662705-eb9b-47b1-90f3-19e3c3633ed0","slug":"tar","title":"tar","category":"Informatique","author":"cedric@abonnel.fr","cover":"","published":true,"published_at":"2023-02-06 17:14:54","created_at":"2023-02-06 17:14:54","updated_at":"2023-02-06 17:14:54","plain":"--\nComparaison des résultats des archives\nLes archives tar ont une taille différentes suivant les options de compression utilisée. Par exemple, un dossier html contenant des fichiers HTML, CSS et JS :\narchive | taille (octets) |\n------- | --------------- |\ntar | 40960 |\ntar.gz | 6200 |\ntar.bz2 | 6003 |\ntar.xz | 5656 | Voyons les commandes et options possibles. tar sous Liunx : compresser et décompresser\nPour <u>créer une archive</u> tar <u>d'un ou plusieurs fichiers</u>, on utilise la syntaxe tar cvf archive.tar fichier1 fichier2...\n- Pour <u>créer une archive</u> tar <u>d'un dossier</u>, on utilise la syntaxe\n tar cvf archive.tar dossier/\n \nLe chemin complet de dossier sera copié dans l'archive. Attention à la décompression.\n- Pour <u>extraire les fichiers d'une archive</u> tar, on utilise la syntaxe \n tar xvf archivedossier.tar\n- Pour <u>afficher le contenu d'une archive</u>, on utilise la syntaxe tar tvf archivedossier.tar tar.gz sous Liunx : compresser et décompresser\nLa manipulation des archives tar.gz s'effectue systématiquement avec l'option z.\n- Pour <u>créer une archive</u> compressée tar.gz <u>d'un ou plusieurs fichiers</u>, on utilise la syntaxe avec l'option c\n tar zcvf archive.tar.gz fichier1 fichier2... Pour <u>créer une archive</u> compressées tar.gz <u>d'un dossier</u>, on utilise la syntaxe la même syntaxe\n tar zcvf archive.tar.gz dossier/\n- Pour <u>créer une archive</u> compressée tar.gz d'un ou plusieurs fichiers sans les informations de l'owner et du groupe renseignée, on utilise la syntaxe suivante : tar zcvf archive.tar.gz . --owner=0 --group=0\n \nIl faudra veiller à laisser des instructions pour attribuer des droits.\n- Pour <u>extraire les fichiers</u> d'une archive compressée tar.gz, on utilise la syntaxe avec l'option x\n tar zxvf archivedossier.tar.gz\n- Pour <u>afficher le contenu</u> d'une archive, on utilise la syntaxe avec l'option t tar ztvf archivedossier.tar.gz\n- Pour <u>supprimer un fichier</u> dans l'archive, on utilise la syntaxe avec l'option delete tar zvf archivedossier.tar.gz --delete your/path/to/delete\n \n \n \n \ntar.xz sous Liunx : compresser et décompresser\nPour <u>créer une archive</u> compressée tar.xz <u>d'un ou plusieurs fichiers</u>, on utilise la syntaxe\n tar Jcvf archive.tar.xz fichier1 fichier2...\n- Pour <u>créer une archive</u> compressées tar.xz <u>d'un dossier</u>, on utilise la syntaxe\n tar Jcvf archive.tar.xz dossier/\n- Pour <u>extraire les fichiers</u> d'une archive compressée tar.xz, on utilise la syntaxe\n tar Jxvf archivedossier.tar.xz\n tar.bz2 sous Liunx : compresser et décompresser\nPour <u>créer une archive</u> compressée tar.bz2 <u>d'un ou plusieurs fichiers</u>, on utilise la syntaxe \n- Pour <u>créer une archive</u> compressées tar.bz2 <u>d'un dossier</u>, on utilise la syntaxe \n- Pour <u>afficher le contenu</u> tar.bz2 d'une archive, on utilise la syntaxe tar tvf archive.tar.bz2 '.txt'\n-- Pour <u>extraire les fichiers</u> d'une archive compressée tar.bz2**, on utilise la syntaxe\n tar Jxvf archivedossier.tar.bz2"},"score":1.75,"snippet":"…xemple, un dossier html contenant des fichiers HTML, CSS et <mark>JS</mark> :\narchive | taille (octets) |\n------- | --------------- |\ntar | 40960 |\ntar.gz | 6200 |\ntar.bz2 | 6003 |\ntar.xz | 5656 | Voyons les commandes et options poss…","tier":2}]