2010-03-23 6 views
0

Le message d'erreurPHP erreur fatale, en essayant de méthode de requête à l'intérieur de modèle à plusieurs reprises

[23-Mar-2010 08:36:16] PHP Fatal error: Cannot redeclare humanize() (previously declared in /Users/tmclssns/Sites/nadar/nadar/trunk/webapp/application/filer/models/Filer/Aggregate.php:133) in /Users/tmclssns/Sites/nadar/nadar/trunk/webapp/application/filer/models/Filer/Aggregate.php on line 133

J'ai un modèle « Filer » qui contient plusieurs méthodes pour générer des graphiques. Chaque méthode liée à la génération de graphes a le suffixe "Graph" dans le nom de la méthode. Comme nous avons quelques problèmes de performance, j'essaie de rendre les graphes à l'avance (en utilisant cron) au lieu de les rendre à chaque requête. Le code ci-dessous est ce que je suis venu avec:

public function generategraphsAction() 
    { 
     $this->_helper->viewRenderer->setNoRender(); 
     $config = Zend_Registry::get('config'); 
     $id = $this->_getParam('filerid'); 

     $filer = new Filer($id); 
     $filer_methods = get_class_methods($filer); 

     foreach ($filer_methods as $filer_method) { 
      if (preg_match('/^(.*)Graph$/i', $filer_method, $matches)) { 
       $path = $config->imaging_caching_dir . "/$id/{$matches[1]}.png"; 
       $filer->$matches[0]($path); 
      } 
     } 

     // var_dump(get_class_methods($filer)); die; 
    } 

Le résultat de la var_dump(), lorsque décommentée, est: méthode

array 
    0 => string '__construct' (length=11) 
    1 => string 'find_by_name' (length=12) 
    2 => string 'getPartner' (length=10) 
    3 => string 'getSlots' (length=8) 
    4 => string 'getGroups' (length=9) 
    5 => string 'grouplist' (length=9) 
    6 => string 'getAggregates' (length=13) 
    7 => string 'getVolumes' (length=10) 
    8 => string 'getAggregateVolumes' (length=19) 
    9 => string 'getShelves' (length=10) 
    10 => string 'getAutoSupportHistory' (length=21) 
    11 => string 'getAutoSupportMail' (length=18) 
    12 => string 'getOrphans' (length=10) 
    13 => string 'getAll' (length=6) 
    14 => string 'getDiskRevOverview' (length=18) 
    15 => string 'getDiskTypeOverview' (length=19) 
    16 => string 'getDiskTypeSizeFunctionOverview' (length=31) 
    17 => string 'getLicenses' (length=11) 
    18 => string 'removeGroup' (length=11) 
    19 => string 'addGroup' (length=8) 
    20 => string 'hasGroup' (length=8) 
    21 => string 'aggdefaultGraph' (length=15) 
    22 => string 'aggbarGraph' (length=11) 
    23 => string 'voldefaultGraph' (length=15) 
    24 => string 'volbarGraph' (length=11) 
    25 => string 'replicationGraph' (length=16) 
    26 => string 'getReplicationData' (length=18) 
    27 => string 'humanize' (length=8) 
    28 => string 'getFiler' (length=8) 
    29 => string 'getOptions' (length=10) 
    30 => string 'getCifsInfo' (length=11) 
    31 => string 'getCifsStats' (length=12) 
    32 => string '__get' (length=5) 
    33 => string 'tr' (length=2) 
    34 => string 'trs' (length=3) 
    35 => string 'fieldList' (length=9) 

Le generategraphsAction() trouve les méthodes du 'Graphique' correctement: Toutefois, lorsque le premier graphe est généré, il génère l'erreur fatale PHP listée ci-dessus. Quelqu'un peut-il trouver une solution à cela? J'ai essayé de passer par référence ou de changer quelques choses (comme re-déclarer le modèle Filer, $ current_filer = nouveau Filer ($ id), et unset() encore après la requête, mais a abouti à la même erreur) sans beaucoup de succès .

La méthode référencée "humanize" n'est pas utilisée pour tout ce que je fais en ce moment, mais appartient au modèle car il est utilisé à plusieurs autres endroits. Bien sûr, la suppression de la méthode n'est pas vraiment une option pour le moment, et le modèle contient plusieurs autres méthodes, donc je suppose que si je déplace juste la méthode humanize, cela générera une erreur sur la suivante.

Pour référence, la méthode humanize():

public function humanize ($kbytes, $unit = null) { 
     // KiloByte, Megabyte, GigaByte, TeraByte, PetaByte, ExaByte, ZettaByte, YottaByte 
     $units = array('KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); 
     if (null !== $units) { 
      $i = array_search(substr($unit, -2), $units); 
      if (! $i) { 
       $i = floor((strlen($kbytes) - 1)/3); 
      } 
     } else { 
      $i = floor((strlen($kbytes) - 1)/3); 
     } 
     $newSize = round($kbytes/pow(1024, $i), 2); 
     return $newSize . $units[$i]; 
    } 

Merci à l'avance pour l'aide offerte.

+1

Pour moi cela ressemble à un cercle PHP require/include - est-ce possible? Comment incluez-vous les fichiers php? – mattanja

+0

@mattanja: Je n'inclue rien manuellement. Zend Framework assure le chargement automatique des contrôleurs, des modèles, etc.Je suis d'accord que si je fais plusieurs déclarations sur le même modèle dans la boucle, mais ce n'est pas le cas. – Tom

Répondre

0

Je m'attends à ce que vos parenthèses soient erronées et votre déclaration humanize de fonction est dans une boucle while d'où la redéclaration.

À moins bien sûr d'inclure le fichier qui définit cette fonction deux fois quelque part?

+0

j'ai énuméré le script complet (modèle de serveur de fichiers) à http://forums.zend.com/viewtopic.php?f=69&t=5888 ainsi. Je fais une instance de ce modèle en dehors de la boucle, donc c'est seulement appelé une fois. À moins que Zend Framework ne fasse des trucs magiques quelque part ... – Tom

0

J'ai trouvé la cause, à l'intérieur de la première méthode aggdefaultGraph, un appel est fait à un autre modèle:

Filer_Aggregate::sums($this->aggregates); 

A l'intérieur du modèle Filer_Aggregate cependant, un appel est fait à nouveau au modèle Filer:

$dataset[] = array('The rest: '.Filer::humanize($rest), $rest, 'rest', 'white', array_shift($colors)); 

C'est la raison pour laquelle il affiche cette erreur de redéclairage. Maintenant, j'ai besoin de trouver une solution à ce problème.

0
public static function sums ($aggregates) { 
    function humanize(&$item, $key) { 
     $item = Filer::humanize($item); 
    } 

    $sums = array('size_total' => 0, 'size_usable' => 0, 'size_snapshot_reserve' => 0, 
        'size_snapshot_used' => 0, 'size_snapshot_free' => 0, 
        'size_active_fs_used' => 0, 'size_active_fs_free' => 0, 
        'size_active_fs_reserved' => 0); 
    foreach ($aggregates as $aggregate) { 
     if ($aggregate->state !== 'online') continue; 
     $sums['size_total'] += $aggregate->size_total; 
     $sums['size_usable'] += $aggregate->size_usable; 
     $sums['size_snapshot_reserve'] += $aggregate->size_snapshot_reserve; 
     $sums['size_snapshot_used'] += $aggregate->size_snapshot_used; 
     $sums['size_snapshot_free'] += $aggregate->size_snapshot_free; 
     $sums['size_active_fs_used'] += $aggregate->size_active_fs_used; 
     $sums['size_active_fs_free'] += $aggregate->size_active_fs_free; 
     $sums['size_active_fs_reserved'] += $aggregate->size_active_fs_reserved; 
    } 
    $humanSums = $sums; 
    array_walk($humanSums, 'humanize'); 
    return array($sums, $humanSums); 
} 

La fonction fonction interne est le coupable.

0

Problème résolu.
L'ajout du bloc if (! Function_exists ('humanize')) autour de la déclaration de méthode l'a résolu.

Questions connexes