Gérer le timeout lors du calcul des filtres images
Bonjour,
Un rédacteur a mis plusieurs centaines de <doc...> DANS LE TEXTE d'un article, ce qui s'est traduit par un timeout lors de l'affichage de l'article. Si les documents ne sont pas dans le texte de l'article, cela ne pose pas de problème.
Le rédacteur ne peut pas deviner que, lors du calcul de la page, SPIP va calculer autant de fois le squelette doc.html qu'il y a de <doc...> dans le texte de l'article, ce qui augmente le temps de traitement.
Aussi, une idée consisterait à ce que SPIP informe le rédacteur, au moment de l'enregistrement de son article, si ce dernier dépasse la limite du nombre maximal de <doc...> ou <img... ou ... dans le texte de l'article. Cette limite serait paramétrable via une constante _MAX_INCLURE_MODELES à placer dans un fichier d'options. Si cette constante n'existe pas le fonctionnement de SPIP resterait inchangé. Ce traitement, pourrait être effectué, par exemple, via la fonction formulaires_editer_article_verifier_dist en lui ajoutant par exemple les lignes suivantes :
if (defined('_MAX_INCLURE_MODELES') AND intval(_MAX_INCLURE_MODELES)>0) { $texte = _request('texte'); if (strpos($texte,"<")!==false){ if (preg_match_all('/<[a-z_-]{3,}\s*[0-9|]+/iS', $texte, $matches, PREG_SET_ORDER)>intval(_MAX_INCLURE_MODELES)) $erreurs['texte'] = _T('info_trop_de_modeles'); } }
Comme cette fonction formulaires_editer_article_verifier_dist restera sans effet pour les articles déjà existants et que l'on ne modifie pas, il est intéressant d'intervenir également sur la fonction inclure_modele. Il s'agit de faire en sorte que la page s'affiche avec tout le texte de l'article, mais celui-ci contiendrait uniquement les _MAX_INCLURE_MODELES premiers documents (ou images ou ...).
Le début de la fonction de SPIP « inclure_modele » se verrait ainsi ajouter les 2 lignes ci-dessous qui portent sur $compteur_total (à noter que $compteur existe déjà actuellement pour les modèles inconnus, et est décrémenté plus loin dans la fonction si le modèle est connu) :
function inclure_modele($type, $id, $params, $lien, $connect='') { static $compteur; static $compteur_total; if (++$compteur>10) return ''; # ne pas boucler indefiniment if (defined('_MAX_INCLURE_MODELES') AND intval(_MAX_INCLURE_MODELES)>0 AND ++$compteur_total>intval(_MAX_INCLURE_MODELES)) return '';
Cordialement Equipement