IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fichier sitemap dynamique avec une regex et la technique "du renard boiteux"


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 111
    Par défaut Fichier sitemap dynamique avec une regex et la technique "du renard boiteux"
    Salut à tous !
    -> la technique "du renard boiteux", c'est moi qui l'ai inventée, étant autodidacte, en général je me débrouille tout seul ...

    Alors voilà ce que j'ai essayé de faire :

    J'ai une interface back-end où on enregistre des produits.

    Lors d'un enregistrement, une portion de code est ajoutée à mon sitemap afin de référencer le produit.

    Je procède comme ceci :

    Au tout début le sitemap (vide) avec un commentaire "ADDS"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <!-- ADDS -->
    </urlset>
    Lors d'un enregistrement de produit, je remplace <!-- ADDS -->
    par ma nouvelle entrée de sitemap + <!-- ADDS --> (à la fin)
    cf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    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
        // RECORD IN SITEMAP
     
        // specify timezone un-bug in my server
        $timezone = new DateTimeZone('Europe/Paris');
        $date = new DateTime(null, $timezone);
        $timestamp = intval($date_prod);
        $date->setTimestamp($timestamp);
        $date_format = $date->format('Y-m-d');
     
        // OPEN sitemap by file_get_contents($file);
        $path = '../sitemap.xml';
        $sitemap = file_get_contents($path);
     
        // FORMAT THE TITLE IN CORRECT URL
        $format_title =  res::suppr_accents($titre);
     
        // ID of the product (got before)
        $id = $rec_and_return_id;
     
        // contruct the new entry for sitemap
        $insert_in_sitemap = "<!-- PROD-ID-".$id." -->
        <url>
        <loc>https://".$_SERVER['SERVER_NAME']."/Bracelet/".$format_title."/".$id."-".$date_prod."</loc>
        <lastmod>".$date_format."</lastmod>
        <changefreq>weekly</changefreq>
        <priority>1.0</priority>
        </url>
        <!-- END-PROD-ID-".$id." -->
        <!-- ADDS -->";
     
        // DO THE DUST
        $insert_in_sitemap_pre_reg = preg_replace("/\s\s+|\t/", "", $insert_in_sitemap);
     
        // replace the comm. ADDS by new entry on the str. $sitemap
        $insert_in_sitemap = str_replace('<!-- ADDS -->', $insert_in_sitemap_pre_reg, $sitemap);
     
        // PUT the new sitemap
        $record_sitemap = file_put_contents($path, $insert_in_sitemap);
    Alors là je crie ma joie , ça fonctionne !

    Je me dis alors, je refait l'inverse pour supprimer cette entrée au sitemap quand on supprime un produit, (simple, basique )

    dans ma fonction suppr_prod($id)
    je n'ai qu'à placer une regex qui me cherche
    <!-- PROD-ID-".$id." --> Et tout ce qu'il y au millieu <!-- END-PROD-ID-".$id." -->
    et je remplace par rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sitemap_replaced = preg_replace("/<!-- PROD-ID-".$id." -->.*<!-- END-PROD-ID-".$id." -->/", "", $sitemap);
    // et je ré-enregistre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // PUT the new sitemap
    $record_new_sitemap = file_put_contents($path, $sitemap);
    Mais voilà après quelques heures devant le regex tester et ayant trouvé la bonne formule (magique) dans celui-ci, mon entrée
    dans le sitemap n'est pas effacée ...

    Je me retrouve obligé de faire un appel supplémentaire à la base de donnée avec l'id du produit,
    de reconstruire une string identique à mon entrée avec les infos récoltées, de refaire tout un formatting ...

    Bref, ça fonctionne, très bien même MAIS c'est la technique "du renard boiteux" ... c'est vilain et ça m'oblige de refaire un appel à la base,
    ce que je trouve stupide et énergivore, d'autant plus que j'ai construit mon système pour me servir uniquement de l'ID du
    produit ...

    Merci de m'éclairer de vos réponses !

    Raf

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 75
    Par défaut
    Bonjour,

    Essaie le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $record_new_sitemap = file_put_contents($path, $sitemap_replaced);
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $record_new_sitemap = file_put_contents($path, $sitemap);

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Généralement le renard, même quand il boite, est plutôt un animal malin à qui il ne viendrait pas à l'idée de modifier un fichier xml avec la technique dite d'Ysengrin, c'est à dire comme si c'était un fichier texte lambda, à coup de fonctions de manipulation de chaînes et de regex.

    Un renard que j'ai bien connu m'a dit un jour d'utiliser DOMDocument et les autres classes associées pour lire, éditer, puis enregistrer les fichiers xml. Avec ça, plus besoin de mettre des commentaires comme repère et même plus besoin des fonctions file_get_contents/file_put_contents puisque DOMDocument à des méthodes pour lire et enregistrer les fichiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // ajout d'une page
    $dom = new DOMDocument;
    $dom->load($path);
     
    $ns = 'http://www.sitemaps.org/schemas/sitemap/0.9';
     
    $urlElt = $dom->createElementNS($ns, 'url');
    $urlElt->appendChild($dom->createElementNS($ns, 'loc', $location));
    $urlElt->appendChild($dom->createElementNS($ns, 'lastmod', $lastModification));
    $urlElt->appendChild($dom->createElementNS($ns, 'changefreq', $changeFrequency));
    $urlElt->appendChild($dom->createElementNS($ns, 'priority', $priority));
     
    $dom->documentElement->appendChild($urlElt);
     
    $dom->save($path);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // suppression d'une page avec l'id
    $dom = new DOMDocument;
    $dom->load($path);
     
    $ns = 'http://www.sitemaps.org/schemas/sitemap/0.9';
     
    foreach ($dom->getElementsByTagNameNS($ns, 'loc') as $locNode) {
        $locID = strrchr($locNode->nodeValue, '/');
        $locID = substr($locID, 1, strpos($locID, '-') - 1);
     
        if ( $locID === $id ) {
            $dom->documentElement->removeChild($locNode->parentNode);
            break;
        }
    }
     
    $dom->save($path);
    Ceci étant dit, reconstruire intégralement ton fichier sitemap à partir de la base de données n'a rien de si échevelé dans la mesure où ce n'est pas une opération qu'on fait toutes les 5 minutes.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 111
    Par défaut
    Salut Pascal, salut Knack's !

    Merci de votre attention et de vos réponses,
    pour répondre au premier, le code fournit en ex. a sûrement une erreur, le code en interne fonctionne, mais merci de ta lecture aiguisée !

    Alors pour répondre à Knack's, oui effectivement c'est plus propre, c'est ce que je recherchais,
    j'avais vu cette fonction DOMDocument dans des histoires de parsage de sites web et j'avais pris cette fonction pour du JS ...
    Avec le fatigue et le fait de jongler en permanence entre les deux, je finit par confondre les langages.

    Bon je suis heureux de rencontrer une nouvelle fonctionnalité PHP (qui semble être insondable ) que je ne connaissait pas,
    je vais m'enquérir de la documentation afin de bien cerner ton code, que je comprend déjà bien ce que tu y fait (en parlant bien français)
    et je te remercie beaucoup de m'avoir fait progresser un peut plus de part ta connaissance !

    Alors, doc. recoding et je reviendrais vers vous pour un feed back.

    P.S: alors pour à chaque fois refaire des appels à la DB, oui, mais en fait ça serait trop énergivore dans mon cas :
    l'utilisateur peut rapidement créer, supprimer des produits,je construit un système de boutique en ligne (oui, je suis un peut fou ...)
    il y a pas mal d'étapes déjà dans le record des produits (upload des images redimensionnées à la volée, record des nouvelles images etc...)
    alors pour que ça ne rame pas trop j'avais pas envie à cette étape de re-parcourir toute la table "produits" pour reconstruire un xml tout frais
    mais ton exemple est nickel il me semble, je pars étudier cette fonction.

    Merci !

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 75
    Par défaut
    Concernant tes inquiétudes énergivores, ce n'est pas une requête sur une base de données qui doit t'inquiéter, les bases de données sont conçues pour traiter des requêtes. Si réellement cela consomme des ressources c'est l'indexation de la base de données qu'il faut sans doute revoir. Normalement l'écriture d'un fichier sur le disque est plus énergivore qu'une requête en base pour récupérer une liste d'articles.

    D'autre part tu peux très bien ne construire ton fichier sitemap que lorsqu'un moteur de recherche va venir le lire, ça m'étonnerais que ça dépasse une fois par jour (à moins que ta boutique ça soit celle de la fnac).
    Tu peux par exemple pour cela faire une redirection avec apache de sitemap.xml vers le fichier php de ton choix qui se chargera de générer un sitemap actualisé.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 111
    Par défaut
    Salut,
    "Tu peux par exemple pour cela faire une redirection avec apache de sitemap.xml vers le fichier php de ton choix qui se chargera de générer un sitemap actualisé.",

    -> c'est pas une mauvaise idée, tu as raison,
    concrètement ta redirection tu la fait au niveau de .htaccess ?
    qui pointe vers built_sitemap.php -> et là un code qui génère le code du sitemap après construction depuis la base de donnée ?

    Oui, je vais garder cette idée sous le coude, ici effectivement je voulais avoir un aperçu direct de l'opération générée,
    voir si mes url étaient correctement reformatées, si tout était bien généré comme il faut ...

    Bon, en même temps ça ne me fait pas de mal de me plonger dans la doc PHP sur une fonction que je ne connaissait pas.
    Je suis donc parti sur l'idée de Knack's.

    Après si tu veux jeter un coup d'oeuil sur la structure de ma base produit, je prend toute critique
    (elle n'auras pas la même config. à la fin car les catégories seront dynamiques)
    ladite base :
    Nom : A PROD SQL.JPG
Affichages : 251
Taille : 246,3 Ko

    Bon voilà, je vais doucement, je travaille sur mes propres fonds sur ce projet (c'est à dire largement en dessous du seuil de pauvreté!)
    avec tous les sociaux qui me cassent les couillent (et oui pour toucher le rsa il faut être capable d'endurer le pire: humiliations, contrôles,
    pressions pour un retour à l'emploi salarié, et j'en passe ...)
    alors que je suis en auto-entreprise et que je paye mes fu**ing taxes dès que j'ai un euro qui rentre ...
    N'ayant rien à foutre de l'argent et n'en désirant pas, ce qui m'intéresse c'est de créer, le plus proprement possible,
    un beau programme qui sera facile à employer (je me suis largement pris la tête avec prestashop, oscomm., tomato, etc..)
    et en open source, ça aussi ces putains de sociaux ils ne le comprennent pas
    ("c'est pour revendre après ? c'est ça ?") - Non, co...asse ! C'est juste pour que je kiffe ma vie mais ça, ça t'échappe !
    -> bon ok , je suis pas du matin ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Problème avec une ReGex
    Par Death83 dans le forum Langage
    Réponses: 9
    Dernier message: 27/07/2006, 21h27
  2. Comment créer un site immobilier dynamique avec une base de données ?
    Par Alain troverti dans le forum Général Conception Web
    Réponses: 14
    Dernier message: 07/07/2006, 21h57
  3. Problème avec une RegEx
    Par Death83 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 26/05/2006, 14h03
  4. [XSLT] Création de fichier XML dynamique avec PHP
    Par daninho dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 02/02/2006, 11h18
  5. Couleur de cellule XSL dynamique avec une variable
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/10/2005, 11h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo