zona7o
@zona7o
Веб-разработчик

Кто имеет опыт в оптимизации Perl скриптов?

Доброе утро. Столкнулся со следующей проблемой.
Есть проект, код которого написан на Perl. Поддерживал его долгое время, но вот настала беда - поддержка упирается в ресурсы системы.

Человек, который писал этот код, не на связи.

Суть следующая, есть
sub treecom{} которая выводит комментарии. Рекурсионно. Но запросы к БД - в каждой итерации.

На php написать могу и исправить - но как внедрить код - непонятно, поэтому нужна следующая помощь.

Нужен костяк функции, которая на пхп выглядела бы ~ так:
function getcomments($id){
$tree = array();
$comments = Db::getCommentsByArticle($id);
foreach ($comments as $row){
$tree[$row->parent][] = $row;
}
return getTreeComments($tree, 0);
}

function getTreeComments($tree, $parent){
$html = '';
if (isset($tree[$iter])){
$html  .= $row->comment;
if (isset($tree[$row->id])){
$html .= getTreeComments($tree, $row->id);
}
return $html;
}


Сам код на Perl
sub treecom {
    ( my $przd, my $y, my $allend ) = @_;
    $cntr++;
    if ( $cntr > 200 ) { print qq[<b>Зацикливание!!</b><br><hr>$bb]; exit; }
    $y++;
    $selectp = "SELECT * FROM table WHERE key = value ORDER BY date ASC, id ASC
    ";
    my $sp = $dbh->prepare($selectp);
    $sp->execute;
    while (
        ( $arid, $namek, $titlek, $textk, $date, $end, $usr_id, $rait, $pub, $usr_name, $status, $src ) =
        $sp->fetchrow_array )
    {
        undef $img;

        if ($src) {
          $img = qq[<img src="/blog/users/$usr_id/profile.$src" width="30px" align="left" hspace="5" />];
        }
        if ( $pub eq "0" && $status < 1 ) { next; }
        $date =~ /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d:\d\d:\d\d)/;
        $dates = qq[$3.$2.$1];
        $time  = $4;
        @tm    = split( ':', $time );
        $time  = qq[$tm[0]:$tm[1]];
        $plft  = ( $y * 10 ) . "px";

        if ( !$usr_name ) { $namek = qq[<font class="nicname">$namek</font>]; }
        else {

          $namek = qq[<div style="width: 50%; float: left;">$img<a href="/reader/$usr_id/" class="nicnamea"><b>$usr_name</b></a>&nbsp;&nbsp;<font class="gryl">$usr_cnt</font></div>];
        }

        $bb .= qq[<tr><td style="padding: 0 0 10px $plft"><a name="cmt$arid"></a>$namek

         <div style="clear: both;"></div>
         <div>$textk</div>
        ];
        
        if ( $end eq "1" && ( $allend eq 0 || $allend >= $y ) ) {
            $allend = $y;
        }
        if ( $allend > $y || $allend eq "0" ) {
            $otv = qq[<a href="/cgi-bin/comment.pl?article=$article&amp;trs=table&amp;parcom=$arid#cform" class="icomm" onclick="atcomm('$arid','table');">[ответить на комментарий]</a>];
        }
        $bb .= qq[<div style="float: left;">$otv</div><div style="float: right;"><font class="gryl">$dates $time</font></div></td></tr>];
        undef $otv;
        $par =
          $dbh->selectrow_array("SELECT id FROM table where parent='$arid'");
        if ($par) { treecom( $arid, $y, $allend ); }
        if ( $y eq $allend ) { $allend = 0; }
    }

    $sp->finish;
}
  • Вопрос задан
  • 367 просмотров
Решения вопроса 1
@pcdesign
my %child;
my $n = $dbh->prepare('SELECT * FROM `table` where key =?  ');
$n->execute($value);
my $all = $n->fetchall_arrayref( {} );
foreach my $item (@$all) {
    print $item->{'arid'};
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
А точно ли проблема "в каждой итерации"? Ты профилировал скрипт?
Сколько там тех комментов? Сто? Двести? Для индексированных запросов это ерунда.
Причины бывают очень разные. Методом тыка ты много не наоптимизируешь
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы