Неустранимая ошибка PHP, при попытке многократного запроса метода внутри модели - PullRequest
0 голосов
/ 23 марта 2010

Сообщение об ошибке

[23 марта 2010 08:36:16] PHP Fatal ошибка: невозможно переопределить humanize () (ранее заявлено в /Users/tmclssns/Sites/nadar/nadar/trunk/webapp/application/filer/models/Filer/Aggregate.php:133) в /Users/tmclssns/Sites/nadar/nadar/trunk/webapp/application/filer/models/Filer/Aggregate.php по линии 133

У меня есть модель "Filer", которая содержит несколько методов для создания графиков. Каждый метод, связанный с созданием графиков, имеет суффикс «График» в имени метода. Поскольку у нас есть некоторые проблемы с производительностью, я стараюсь отображать графики заранее (используя cron), а не отображать их при каждом запросе. Код ниже - это то, что я придумал:

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;
    }

Результат от var_dump () без комментариев:

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)

Метод generategraphsAction () правильно находит методы Graph:

array
  0 => string 'aggdefaultGraph' (length=15)
  1 => string 'aggdefault' (length=10)

array
  0 => string 'aggbarGraph' (length=11)
  1 => string 'aggbar' (length=6)

array
  0 => string 'voldefaultGraph' (length=15)
  1 => string 'voldefault' (length=10)

array
  0 => string 'volbarGraph' (length=11)
  1 => string 'volbar' (length=6)

array
  0 => string 'replicationGraph' (length=16)
  1 => string 'replication' (length=11)

Однако, когда генерируется первый граф, он генерирует вышеперечисленную фатальную ошибку PHP. Кто-нибудь может придумать решение этой проблемы? Я попытался передать по ссылке или переключить несколько вещей (например, повторно объявить модель Filer, $ current_filer = new Filer ($ id); и unset () снова после запроса, но привел к той же ошибке) без особого успеха .

Указанный метод "очеловечивания" не используется ни для чего, что я делаю в данный момент, но относится к модели, потому что он используется в нескольких других местах. Конечно, удаление метода на самом деле не вариант сейчас, и модель также содержит несколько других методов, поэтому я предполагаю, что если я просто переместлю метод гуманизации, он вызовет ошибку следующего.

Для справки: метод 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];
   }

Заранее благодарим за предоставленную помощь.

Ответы [ 4 ]

0 голосов
/ 23 марта 2010

Проблема устранена.
Решение блока if (! Function_exists ('humanize))) вокруг объявления метода решило эту проблему.

0 голосов
/ 23 марта 2010

Я обнаружил причину, внутри первого метода aggdefaultGraph был сделан вызов другой модели:

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

Внутри модели Filer_Aggregate, однако, снова выполнен вызов модели Filer:

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

Это причина, по которой он обнаруживает эту ошибку redeclare.Теперь мне нужно найти решение этой проблемы.

0 голосов
/ 23 марта 2010
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);
}

Функция внутри функции является виновником.

0 голосов
/ 23 марта 2010

Я ожидаю, что ваши круглые скобки неверны, а объявление функции humanize находится внутри цикла while, отсюда и переопределение.

Если, конечно, вы не включаете файл, который где-то определяет эту функцию дважды?

...