Utilisation de eval() avec PHP5

La fonction eval() permet d’évaluer une chaine de caractère comme du code PHP. Elle peut être utile dans certains cas mais pose des problèmes :

  • le code est plus dur à maintenir et à déboguer,
  • l’execution de cette fonction ralenti votre script.

C’est particulièrement vrai pour les eval appelés dans une boucle ; c’est le temps de compilation que vous multipliez dans ce cas là. Si vous devez faire ça, il vaut mieux alors carrément inclure la boucle dans le code à évaluer.

Ce petit script le montre par l’exemple.

$nb_iteration = 400000;

$start_time = microtime(true);
// boucle de référence
for ($i=0; $i <= $nb_iteration; $i++)
{
	$r = $i;
}

$end_time = microtime(true);

echo 'time taken (no eval)        : '.($end_time-$start_time).' s'."n";

$start_time = microtime(true);
// éval a chaque itération
for ($i=0; $i <= $nb_iteration; $i++)
{
	eval('$r = $i;');
}

$end_time = microtime(true);

echo 'time taken (with eval)      : '.($end_time-$start_time).' s'."n";

$start_time = microtime(true);
// eval autour de la boucle
eval (
  'for ($i=0; $i <= $nb_iteration; $i++)
  {
    $r = $i;
  }');

$end_time = microtime(true);

echo 'time taken (with loop eval) : '.($end_time-$start_time).' s'."n";

Il donne les résultats suivants :

$ php eval_speed.php
time taken (no eval)        : 0.248116016388 s
time taken (with eval)      : 6.24511909485 s
time taken (with loop eval) : 0.314826011658 s

Parlant non ?

Publicités

Une réflexion au sujet de « Utilisation de eval() avec PHP5 »

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s