Utilisation de eval() avec PHP5
10 novembre 2007 par Olivier MansourLa 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 ?

Merci pour ce petit test de benchmarking :)