Ошибка при переходе с PHP4 на PHP5

  • Автор темы andrey_fisher
  • Дата начала

andrey_fisher

Guest
Ошибка при переходе с PHP4 на PHP5

Здравствуйте,
я отлаживаю скрипт, до того успешно работавший под php4 и умерший при переходе на php5.

почему-то функция

PHP:
function phpOb_Init( & $loSender ) 
{ 
   global $PHPOB_APP_VARS, $PHPOB_CFG_VARS, $PHPOB_DEF_VARS; 
   $loSender->Name = get_class( $loSender ); 
   $loSender->ParentName = get_parent_class( $loSender ); 
   $loSender->Self = &$loSender; 
   $loSender->APP_VARS = &$PHPOB_APP_VARS; 
   $loSender->CFG_VARS = &$PHPOB_CFG_VARS; 
   $loSender->DEF_VARS = &$PHPOB_DEF_VARS; 
    
   if ( !isset( $loSender->APP_VARS['out'] ) and $loSender->Name != 'output' and !is_subclass_of($loSender, "output") ) 
   { 
       $loSender->out = new Output(); // строка 56 
   } 
   else 
   { 
       $loSender->out = & $loSender->APP_VARS['out']; 
   } 
}

дает вот такую ошибку

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 32 bytes) in /u1/www/fisherspb/album/essential/library/base.pob.php on line 56


(строку 56 я отметил)

memory_limit у старой и новой версий PHP равные - по 8М.
 

tony2001

TeaM PHPClub
конкретно эта строка не при чем.
память ты захламляешь где-то до неё.
 

andrey_fisher

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

а есть ли особенности синтаксиса в php5, которое в этой ф-и не учтены? под php4 работало ведь "на ура"
 

andrey_fisher

Guest
tony2001
удаление лишних & не помогло.

эта функция ниже в коде используется в нескольких классах. может быть проблема там, или же только выше?
 

tony2001

TeaM PHPClub
наверное.
я же говорю - не в функции дело.
возьми [m]memory_get_usage[/m], поставляй везде и смотри где у тебя захламляется память.
 

andrey_fisher

Guest
а вот до этого я не додумался)
получилось вот что. память съедается, когда вступает в дело вот этот класс, использующий описанную выше функцию

PHP:
class Output extends Ubstract
{
    function Output()
    {
        $this->Init();
    }

    function Init()
    {
        phpOb_Init( $this );
        $this->RegisterGlobal();
    }

    function Open()
    {
    }

    function Close()
    {
    }

    function Write()
    {
        foreach( func_get_args() as $args )
        {
            echo $args;
        }
    }

    function WriteLn()
    {
        foreach( func_get_args() as $args )
        {
            echo $args;
        }
        echo "\n";
    }
}
в нем есть что-нибудь, не соответствующее PHP5 ?
 

camka

не самка
Выводи размер используемой памяти после каждой строки, и смотри, съедает ли какая-то строка сразу всю память при одном вызове, или по чуть-чуть и в цикле.

И еще эта строка настораживает. Может рекурсия какая выскакивает, не заметная с первого взгляда.
PHP:
$loSender->Self = &$loSender;
 

andrey_fisher

Guest
нашлась строка, при закомментировании которой память перестает тратиться.

PHP:
   if ( !isset( $loSender->APP_VARS['out'] ) and $loSender->Name != 'output' and !is_subclass_of($loSender, "output") ) 
   { 
       $loSender->out = new Output(); // строка 56 - ВОТ ОНА!
   } 
   else 
   { 
       $loSender->out = & $loSender->APP_VARS['out']; 
   } 
}

то есть, если я правильно понимаю, память тратится при создании нового объекта тогда, когда выполняется class Output ... и как с ней быть?
 

SiMM

Новичок
> и как с ней быть?
Локализовывать и разбираться дальше.
 
Сверху