Changeset 98071 in spip-zone


Ignore:
Timestamp:
May 26, 2016, 4:13:43 PM (3 years ago)
Author:
cedric@…
Message:

Report de r98068 : Certains flux RSS publient l'integralite de leur contenus (par exemple http://www.lelotenaction.org/pages/do/rss.xml) ce qui produit inevitablement un timeout lors de l'analyse et de la syndication.
On optimise les fonctions cdata_echappe et cdata_echappe_retour, et on limite la syndication aux 1000 premiers items, surchargeable par la constante _SYNDICATION_MAX_ITEMS

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _core_/branches/spip-3.1/plugins/sites/inc/syndic.php

    r94396 r98071  
    101101        }
    102102
     103        if (!defined('_SYNDICATION_MAX_ITEMS')) define('_SYNDICATION_MAX_ITEMS',1000);
     104        $nb_items = 0;
    103105        foreach ($items as $item) {
    104106                $data = array();
     107                if ($nb_items++>_SYNDICATION_MAX_ITEMS){
     108                        break;
     109                }
    105110
    106111                // URL (semi-obligatoire, sert de cle)
     
    554559                $regs, PREG_SET_ORDER)) {
    555560                foreach ($regs as $n => $reg) {
    556                         if (preg_match(',[<>],', $reg[1])) {
    557                                 $echappe_cdata[$n] = $reg[1];
    558                                 $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
     561                        if (strpos($reg[1],'<')!==false
     562                          or strpos($reg[1],'>')!==false) {
     563                                // verifier que la chaine est encore dans le flux, car on peut avoir X fois la meme
     564                                // inutile de (sur)peupler le tableau avec des substitutions identiques
     565                                if (strpos($rss,$reg[0])!==false){
     566                                        $echappe_cdata["@@@SPIP_CDATA$n@@@"] = $reg[1];
     567                                        $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
     568                                }
    559569                        } else {
    560570                                $rss = str_replace($reg[0], $reg[1], $rss);
     
    568578function cdata_echappe_retour(&$x, &$echappe_cdata) {
    569579        if (is_string($x)) {
    570                 if (strpos($x, '@@@SPIP_CDATA') !== false
    571                         or strpos($x, '&lt;') !== false
    572                 ) {
     580                if (strpos($x, '&lt;') !== false){
    573581                        $x = filtrer_entites($x);
    574                         foreach ($echappe_cdata as $n => $e) {
    575                                 $x = str_replace("@@@SPIP_CDATA$n@@@", $e, $x);
    576                         }
     582                }
     583                if (strpos($x, '@@@SPIP_CDATA') !== false){
     584                        $x = str_replace( array_keys($echappe_cdata), array_values($echappe_cdata), $x);
    577585                }
    578586        } else {
Note: See TracChangeset for help on using the changeset viewer.