Preg_replace_callback et temp d'execution

cs_MisterV Messages postés 4 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 7 juin 2004 - 21 mai 2004 à 14:33
cs_MisterV Messages postés 4 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 7 juin 2004 - 24 mai 2004 à 11:12
Bonjour,

Il me semble avoir un assez bon niveau en php, et je me retrouve pourtant aujourd'hui confronté a un probleme que je ne sais pas resoudre.

J'ai fait un site web, en utilisant les fonctions ob_start('callback') et ob_end_flush().

Donc avant d'envoyer le resultat au client, la page HTML est traité par une fonction callback.

Dans cette fonction, j'utilise plusieurs fois la fonction preg_replace_callback

Ainsi, lorsque dans une page il y a une adresse mail, une URL, des caractères speciaux ou des mots qui doivent etre mis en gras, la fonction ajoute automatiquement les codes HTML necessaire.

Afin de ne pas toucher aux tags HTML, pour ne pas endommager le code, ma fonction callback est formée de la maniere suivante :

je repere les chaines de type "(balise HTML)(texte jusqu'a la prochaine balise)"

J'envois ces deux partie a une fonction qui traite le texte et renvois la balise + le texte traité.

apres avoir fait les remplacements necessaire la fonction callback retourne le buffer.

C'est donc un systeme peut etre un peu lourd, mais qui marche tres bien sur mon serveur local qu'est un vieux pc.
Par contre ca ne marche pas sur mon hebergeur, apparemment a cause d'un temps d'execution trop long. il n'affiche rien, aucun message d'erreur (a cause du ob_start je suppose), mais j'ai obtenu a un moment lors de tests un message, max execution time exceded(j'me souviens plus trop ce que j'avais fait pour l'obtenir)

voici un exemple de ma fonction callback :

function callback($buffer)
{
function emailCallback($tmp)
{
if(!ereg('(http://|@)', $tmp[1]))
{
$tmp[2] = eregi_replace('(http://[[:alnum:]\._-]+\.[[:alnum:]{2-3}/[[:alnum:]/._-]*)', '[\\1 \\1]', $tmp[2]);
$tmp[2] = eregi_replace('([[:alnum:]]+[[:alnum:]\._-]*[[:alnum:]]+@[[:alnum:]]+[[:alnum:]\._-]*[[:alnum:]]+\.[[:alnum:]]{2,3})', '[mailto:\\1 \\1]', $tmp[2]);
}
return $tmp[1].$tmp[2];
}

$buffer = preg_replace_callback("/(<[^<>]*>)([^<>]*)/", 'emailCallback', $buffer);

/* $GLOBALS['abbr'] est un tableau contenant les abbreviations a traiter et leurs signification */

/* c'est dans cette fonction que je transforme également les caractères speciaux en plus des abbreviations */
function abbrCallback($tmp)
{
$tmp[2] = html_entity_decode($tmp[2], ENT_QUOTES);
$tmp[2] = htmlentities($tmp[2], ENT_QUOTES);
if(ereg('[[:print:]]+', $tmp[2]) && !ereg('(http://|@)', $tmp[2]))
{
foreach($GLOBALS['abbr'] as $key=>$val)
{
$key = htmlentities($key, ENT_QUOTES);
$tmp[2] = ereg_replace('([[:space:][:punct:]]|^)('.$key.')([[:space:][:punct:]]|$)', '\\1\\2\\3', $tmp[2]);
}
}
return $tmp[1].$tmp[2];
}

$buffer = preg_replace_callback("/(<[^<>]*>)([^<>]*)/", 'abbrCallback', $buffer);

/* $GLOBALS['SpWords'] est un tableau contenant les mots a traiter et la class CSS a leur attribuer (differentes class pour mettre en gras ou en couleur etc... */

function SWordsCallback($tmp)
{
if(ereg('[[:print:]]+', $tmp[2]) && !ereg('(http://|@)', $tmp[2]))
{
foreach($GLOBALS['SpWords'] as $key=>$val)
{
$key = htmlentities($key, ENT_QUOTES);
$tmp[2] = eregi_replace('([[:space:][:punct:]]|^)('.$key.')([[:space:][:punct:]]|$)', '\\1\\2\\3', $tmp[2]);
}
}
return $tmp[1].$tmp[2];
}

$buffer = preg_replace_callback("/(<[^<>]*>)([^<>]*)/", 'SWordsCallback', $buffer);

return $buffer;
}


J'ai verifié que les fonction preg_replace_callback et ob_start('callback') marchent sur l'hebergeur

lorsque je supprime les preg_replace_callback de ma fonction, ou que j'en met un qui envois vers une fonction tres simple ca marche !!!

Si vous avez des idées sur la cause de mon probleme, toute suggestion sera la bienvenue.

Je pensais que le systeme etait trop lourd, mais ca marche en local sur un vieux pc donc je doute sur ce point.
Le site est hebergé chez Amen.fr, donc peut etre que cela vient de leurs serveurs qui sont trop lent, mais ca m'etonnerais.

peut etre que je pourrais obtenir le même resultat d'une autre maniere moin couteuse en ressource mais j'vois pas comment, j'chui ouvert a toutes propositions.

Merci d'avance

1 réponse

cs_MisterV Messages postés 4 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 7 juin 2004
24 mai 2004 à 11:12
Finalement j'ai réussit a solutionner mon probleme en reformulant ma fonction.
Je ne sais toujours pas d'ou venait mon probleme, mais bon c'est pas grave c'est oublié c'est fini.

bye
0
Rejoignez-nous