Wikini

GoubSbug

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-54-224-90-25.compute-1.amazonaws.com
Erreur avec la fonction "preg_replace_callback"

Descriptif Cette erreur apparait sur le serveur de mon entreprise et pas sur mon serveur perso avec la meme version de wikini 0.4.1rc
La version du PhP est la 4.3.3 pour mon entreprise et la 4.3.4 sur mon serveur perso
j'ai fait les bouts de code ci dessous pour isoler le probleme. Il apparait que c'est la fonction callback qui pose le probleme. Si on l'écrit différemment à partir d'un create_function le problème est réglé mais je ne sais pas pourquoi !
Goubs

Nota Cela fonctionne aussi si dans le formateur wakka_test.php je change le nom de la fonction call_back. En fait le problème apparait si la fonction de call_back a déjà été utilisée.

****** ci dessous l'action qui pose probleme avec erreur "Impossible d'afficher la page" *********
 (utilise le formatteur wakka_test)
<?php
// Test a partir d'une nouvelle action (actions/test.php)
echo "l'utilisation de la commande <b>Format</b> donne ==> ",$this->Format("--Bonjour le monde--","wakka_test");
?>

****** ci dessous l'action qui fonctionne *********
 (utilise le formatteur wakka_test2)
<?php
// Test a partir d'une nouvelle action (actions/test1.php)
echo "l'utilisation de la commande <b>Format</b> donne ==> ",$this->Format("--Bonjour le monde--","wakka_test2");
?>

**************************
<?php
// Un nouveau formateur simplifié avec fonction callback (formatters/wakka_test.php)

if (!function_exists("wakka2callback")){
    function 
wakka2callback($things){
        
$thing $things[0];
        if (
$thing == "--"){
            return 
"<hr>";
        }
        return 
$thing;
    }
}
$text str_replace("\r"""$text);
$text chop($text)."\n";
$text preg_replace_callback("/--/""wakka2callback",$text);

echo 
$text ;
?>

**************************
<?php
// Un nouveau formateur simplifié avec fonction callback + create_fonction (formatters/wakka_test2.php)

$var'$things';
$fct ='    $thing = $things[0];
        if ($thing == "--")
            return "<hr>";
        return $thing;'
;

$text str_replace("\r"""$text);
$text chop($text)."\n";
$text preg_replace_callback("/--/",create_function($var,$fct),$text);

echo 
$text ;
?>



C'est très intéressant ton bogue ! Et j'aimerais bien qu'on le corrige avant de sortir la 0.4.1 !! Cependant, même si je vois à peu près le problème (scope de la première définition de la fonction je pense), j'ai du mal à en voir la cause... Je pense sincèrement qu'il faut que tu examines les logs de ton serveur apache (en particulier error.log) et que tu nous fasses un diff -u entre les php.ini chez toi et à ton boulo... Je ne vois vraiment pas comment déboguer sinon, désolé... -- ProgFou

Pour les php.ini entre les deux configs j'ai fait un comparatif et il n'y a pas de différences à l'exception de la version 4.3.4 pour mon site perso et 4.3.3 pour celui du boulot. les autres différences concernent la taille mémoire 8Mo perso et 128Mo boulot, le max upload 2 Mo perso et 128Mo boulot et la durée limit de session 180 (perso) et 3600 (boulot). Il y a peut etre un probleme avec les PCRE (discuté avec garfieldfr hier soir) car des rapports de bugs indiquent des problemes de taille mémoire http://bugs.php.net/bug.php?id=25754. Je ne suis pas sur que se soit vraiment cela car dans mon cas de test pour déboggage les regexp sont vraiment tres court ! Je vais voir si il est possible de voir les logs du serveur
-- GoubS

Ok pour le php.ini, c'est déjà ça d'écarté... De mon coté je pense vraiment à un problème de scope de définition, surtout du fait que ça marche quand tu utilises create_function qui redéfinit la fonction en lieu et place de l'appel, et du fait que les actions soient appelées via des inclusions, qui peuvent se faire depuis n'importe où a priori, donc dans n'importe quel scope (méthode de classe Wiki, fonction externe dans une autre action, ...). Il faudrait voir si on peut spécifier le scope de déclaration d'une fonction et permettre ainsi de déclarer forcément le callback en scope global, ça pourrait aider si ma théorie est bonne... -- ProgFou


PagesSuiviesParGoubs
Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]