Erreur bloquante dans class.usertagoperations.inc.php : j'ai trouvé une solution.
En décembre 2023, j'ai eu l'erreur suivante qui m'a bloqué CmsMadeSimple définitivement (l'erreur revenait à chaque appel de index.php) :
Parse error: syntax error, unexpected '}' in /..../..../www/cms/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code on line 1399
J'ai dû réinstaller le cms (version 2.2.19) dans un dossier différent.
Mais au bout de quelques jours, le problème est revenu. J'ai bien dû réinstaller une dizaine de fois.
J'ai été tranquille pendant 3 mois, mais c'est reparti.
Je précise que cela se produit lorsque j'essaie d'enregistrer une balise utilisateur (udt) et que ça ne m'était jamais arrivé avant que je mette le php en version development au lieu de production dans www/.ovhconfig
Mais cette fois, j'ai enfin trouvé comment supprimer l'affichage permanent de l'erreur et le blocage.
C'est pourquoi je vous expose ma méthode au cas où vous auriez les mêmes soucis. Il va quand même falloir mettre les mains dans le cambouis (le php)
Mais je me demande toujours pourquoi certaines fois, les udt sont enregistrés même s'il y a une erreur.
L'erreur est donc dans class.usertagoperations.inc.php, à la ligne 306 pour @eval($code)
function CreateTagFunction($name)
298 { print $name.'<br>'; //ajouté
299 $row = $this->_get_from_cache($name);
if( !$row ) return;
$functionname = 'cms_user_tag_'.$name;
if( !function_exists($functionname) ) {
if( startswith($row['code'],'<?php') ) $row['code'] = substr($row['code'],5);
if( endswith($row['code'],'?>') ) $row['code'] = substr($row['code'],0,-2);
$code = 'function '.$functionname.'($params,$smarty) {'.$row['code']."\n}";
306 @eval($code);
}
return $functionname;
}
J'ai longtemps cru, à cause de la ligne 299, que c'était un problème de cache, mais effacer le cache ne réglait rien.
J'ai ajouté print $name à la ligne 298 pour voir quelle balise provoquait le blocage (l'affichage de l'erreur ne le mentionne pas)
En fait, on voit que tous les udt sont vérifiés à chaque appel de index.php, et c'est donc le dernier affiché qui provoque le blocage.
Pour avoir un plus de détails sur l'erreur, et ne pas bloquer le cms, j'ai ajouté un try - catch autour de @eval($code) :
306 try { eval(@$code); }
catch (ParseError $err) {
print "Erreur dans $name : <br>";
print "$err <br>";
return;
}
Il faut catch (ParseError $err) au lieu d'un simple catch(Exception $ex) parce que eval ne transmet pas des exceptions mais des ParseError.
On obtient alors quelque chose du style :
Erreur dans erreur2: (erreur2 est le nom du userplugin)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in /..../..../www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code:1 (1 est n° de ligne de l'erreur dans le userplugin)
Stack trace: #0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82): UserTagOperations->CreateTagFunction('erreur2')
#1 ...
#2 ...
On peut faciliter la lecture en mettant à partir de la ligne 307 :
catch (ParseError $err) {
$p=strpos($err,'code'); $p2=strpos($err,'Stack'); $ligne=substr($err,$p+5,$p2-$p-6);
print "<br>Erreur dans le plugin $name, ligne $ligne : <br>";
$p= strpos($code,'{'); $code= substr($code,$p+1);
$lignes=explode("\n", $code); print $lignes[$ligne-1].'<br>';
print strtok($err,'#').'<br>';
print strtok('#').'<br>';
return;
}
ce qui donne maintenant :
Erreur dans le plugin erreur2, ligne 1 :
print ... (la ligne qui contient l'erreur)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in /www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code:1 Stack trace:
0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82): UserTagOperations->CreateTagFunction('erreur2')
On peut maintenant supprimer le print $name de la ligne 298
On a réussi à sortir de l'erreur sans bloquer le cms, mais il reste encore une erreur dans un autre fichier ; en effet, la fonction utilisant l'udt n'a toujours pas été créée :
Fatal error: Uncaught --> Smarty: Plugin 'erreur' not callable <-- thrown in /..../..../www/cms4/lib/smarty/sysplugins/smarty_internal_method_registerplugin.php on line 50
A la ligne 50 de smarty_internal_method_registerplugin.php, on trouve : throw new SmartyException("Plugin '{$name}' not callable");
qu'on remplace par : print "<br>Le plugin $name est inutilisable : il faut le corriger ou le supprimer<br>";
Le blocage est terminé , plus besoin de réinstaller !!!
En décembre 2023, j'ai eu l'erreur suivante qui m'a bloqué CmsMadeSimple définitivement (l'erreur revenait à chaque appel de index.php) :
Parse error: syntax error, unexpected '}' in /..../..../www/cms/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code on line 1399
J'ai dû réinstaller le cms (version 2.2.19) dans un dossier différent.
Mais au bout de quelques jours, le problème est revenu. J'ai bien dû réinstaller une dizaine de fois.
J'ai été tranquille pendant 3 mois, mais c'est reparti.
Je précise que cela se produit lorsque j'essaie d'enregistrer une balise utilisateur (udt) et que ça ne m'était jamais arrivé avant que je mette le php en version development au lieu de production dans www/.ovhconfig
Mais cette fois, j'ai enfin trouvé comment supprimer l'affichage permanent de l'erreur et le blocage.
C'est pourquoi je vous expose ma méthode au cas où vous auriez les mêmes soucis. Il va quand même falloir mettre les mains dans le cambouis (le php)
Mais je me demande toujours pourquoi certaines fois, les udt sont enregistrés même s'il y a une erreur.
L'erreur est donc dans class.usertagoperations.inc.php, à la ligne 306 pour @eval($code)
function CreateTagFunction($name)
298 { print $name.'<br>'; //ajouté
299 $row = $this->_get_from_cache($name);
if( !$row ) return;
$functionname = 'cms_user_tag_'.$name;
if( !function_exists($functionname) ) {
if( startswith($row['code'],'<?php') ) $row['code'] = substr($row['code'],5);
if( endswith($row['code'],'?>') ) $row['code'] = substr($row['code'],0,-2);
$code = 'function '.$functionname.'($params,$smarty) {'.$row['code']."\n}";
306 @eval($code);
}
return $functionname;
}
J'ai longtemps cru, à cause de la ligne 299, que c'était un problème de cache, mais effacer le cache ne réglait rien.
J'ai ajouté print $name à la ligne 298 pour voir quelle balise provoquait le blocage (l'affichage de l'erreur ne le mentionne pas)
En fait, on voit que tous les udt sont vérifiés à chaque appel de index.php, et c'est donc le dernier affiché qui provoque le blocage.
Pour avoir un plus de détails sur l'erreur, et ne pas bloquer le cms, j'ai ajouté un try - catch autour de @eval($code) :
306 try { eval(@$code); }
catch (ParseError $err) {
print "Erreur dans $name : <br>";
print "$err <br>";
return;
}
Il faut catch (ParseError $err) au lieu d'un simple catch(Exception $ex) parce que eval ne transmet pas des exceptions mais des ParseError.
On obtient alors quelque chose du style :
Erreur dans erreur2: (erreur2 est le nom du userplugin)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in /..../..../www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code:1 (1 est n° de ligne de l'erreur dans le userplugin)
Stack trace: #0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82): UserTagOperations->CreateTagFunction('erreur2')
#1 ...
#2 ...
On peut faciliter la lecture en mettant à partir de la ligne 307 :
catch (ParseError $err) {
$p=strpos($err,'code'); $p2=strpos($err,'Stack'); $ligne=substr($err,$p+5,$p2-$p-6);
print "<br>Erreur dans le plugin $name, ligne $ligne : <br>";
$p= strpos($code,'{'); $code= substr($code,$p+1);
$lignes=explode("\n", $code); print $lignes[$ligne-1].'<br>';
print strtok($err,'#').'<br>';
print strtok('#').'<br>';
return;
}
ce qui donne maintenant :
Erreur dans le plugin erreur2, ligne 1 :
print ... (la ligne qui contient l'erreur)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in /www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code:1 Stack trace:
0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82): UserTagOperations->CreateTagFunction('erreur2')
On peut maintenant supprimer le print $name de la ligne 298
On a réussi à sortir de l'erreur sans bloquer le cms, mais il reste encore une erreur dans un autre fichier ; en effet, la fonction utilisant l'udt n'a toujours pas été créée :
Fatal error: Uncaught --> Smarty: Plugin 'erreur' not callable <-- thrown in /..../..../www/cms4/lib/smarty/sysplugins/smarty_internal_method_registerplugin.php on line 50
A la ligne 50 de smarty_internal_method_registerplugin.php, on trouve : throw new SmartyException("Plugin '{$name}' not callable");
qu'on remplace par : print "<br>Le plugin $name est inutilisable : il faut le corriger ou le supprimer<br>";
Le blocage est terminé , plus besoin de réinstaller !!!