0 votes

Mon code de sitemap xml autogénéré fonctionne très lentement, puis-je améliorer sa performance ?

J'ai écrit un code de génération automatique de sitemap ci-dessous, il est appelé toutes les 12 heures. Il consulte la base de données mysql, et génère ensuite l'entrée dans le fichier xml pour chaque ligne qu'il trouve dans la table mysql.

Je ne suis pas le meilleur codeur PHP, donc j'espère que vous pourrez m'aider à améliorer ce qui suit.

Il fonctionne et fait son travail, mais le fait d'avoir plus de 400 000 publicités peut le rendre assez lent.

 function xml_sitemap() {
    $website_url="/SV/Sitemap/";
    $ads_query_results = mysql_query("SELECT * FROM cars_db ORDER BY insert_date DESC") or die(mysql_error());
    $nr_of_sitemaps = count(glob('../../Sitemap/*')); 
    //$nr_files=1;
    $row_data_seek=1;

    for ($i=1; $i<$nr_of_sitemaps; $i++){
        if ($nr_of_sitemaps!='.' || $nr_of_sitemaps!='..'){
            $nr_files++;
        }
    }
    for ($i=1; $i<=$nr_of_sitemaps; $i++){
        unlink('../../Sitemap/Sitemap'.$i.'.xml');
    }
    $number_of_ads = mysql_num_rows($ads_query_results);
    $files_needed = ($number_of_ads/49500);
    $files_needed = ceil($files_needed);

for ($i=1; $i<=$files_needed; $i++){
    $xml_file = fopen ('../../Sitemap/Sitemap'.$i.'.xml','w');
    fwrite ($xml_file,"<?xml version='1.0' encoding='UTF-8'?>\n");
    fwrite ($xml_file,"<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n");

        for ($z=0; $z<($number_of_ads/$files_needed); $z++){
        mysql_data_seek($ads_query_results, $z);
        $row_results=mysql_fetch_array($ads_query_results);

        $current_ad_id= $website_url.$row_results['ad_category'].'/';
        $current_ad_id = $current_ad_id.$row_results['ad_id'].'.htm';
        $last_modified = date('Y-m-d', strtotime($row_results['insert_date']));
        $change_frequency = 'weekly';

            fwrite ($xml_file, "<url>\n");
                fwrite ($xml_file, "<loc>");
                fwrite ($xml_file, $current_ad_id);
                fwrite ($xml_file, "</loc>\n");
                fwrite ($xml_file, "<lastmod>");
                fwrite ($xml_file, $last_modified);
                fwrite ($xml_file, "</lastmod>\n");
                fwrite ($xml_file, "<changefreq>");
                fwrite ($xml_file, $change_frequency);
                fwrite ($xml_file, "</changefreq>\n");
                fwrite ($xml_file, "<priority>");
                fwrite ($xml_file, 0.8);
                fwrite ($xml_file, "</priority>\n");
            fwrite ($xml_file, "</url>\n");
        } //end for

    fwrite ($xml_file, "</urlset>");    
    fclose ($xml_file);
}//end main for
}

2voto

mattbasta Points 7377

D'après ce que je peux voir, votre code est assez optimisé. Quels sont les temps de construction que vous observez ? Des minutes ? Des heures ?

Il y a quelques changements que vous pouvez apporter d'emblée :

Modifier ce code :

for ($z=0; $z<($number_of_ads/$files_needed); $z++){

a

$count = ($number_of_ads/$files_needed);
for ($z=0; $z<$count; $z++){

Chaque itération de votre boucle exécutera l'expression de fin. Si vous avez un grand nombre d'enregistrements (400 000 par exemple), vous rencontrerez des ralentissements importants.

Combinez vos fwrite déclarations :

fwrite ($xml_file, "<url>\n");
    fwrite ($xml_file, "<loc>");
    fwrite ($xml_file, $current_ad_id);
    fwrite ($xml_file, "</loc>\n");
    fwrite ($xml_file, "<lastmod>");
    fwrite ($xml_file, $last_modified);
    fwrite ($xml_file, "</lastmod>\n");
    fwrite ($xml_file, "<changefreq>");
    fwrite ($xml_file, $change_frequency);
    fwrite ($xml_file, "</changefreq>\n");
    fwrite ($xml_file, "<priority>");
    fwrite ($xml_file, 0.8);
    fwrite ($xml_file, "</priority>\n");
fwrite ($xml_file, "</url>\n");

pourrait devenir :

fwrite($xml_file, "<url><loc>$current_ad_id</loc><lastmod>$last_modified</lastmod><changefreq>$change_frequency</changefreq><priority>0.8</priority></url>");

Bien sûr, c'est plus compliqué, mais une seule écriture vaut mieux que plus de 10.

Essayez également d'éviter d'utiliser strtotime . C'est une fonction lente et sale. Si vous le pouvez, essayez d'utiliser une logique simple pour éviter de l'utiliser.

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X