develooper Front page | perl.beginners | Postings from February 2002

fastCGI Perl & memory

From:
Roman Fordinal
Date:
February 1, 2002 01:57
Subject:
fastCGI Perl & memory
Message ID:
18412054993.20020201103111@slovanet.sk

that is full script.
it is fastCGI and problem is memory used by this script.
after yester run is used memory by script bigger and bigger :(
i ned absolute flushing memory from added "modul" (sorry for my
english)

#!/usr/bin/perl
use FCGI;
use Mysql;

require "default.conf";
require "default.def";
require "_cookie.mdl";

# RELOAD
############

sub fcgi_exit
{
 my $request = FCGI::Request();
 $request->Finish();
 exit(0);
}

# CREATE LOG
############
sub save_log
{
 my($uroven,$text) = @_;
 if ($uroven<=$log)
 {
  open (HND, ">>_logs/$Wyear$Wmom$Wmday-$$-$Whour.fastlog");
  print HND "\\$$\\$fastcount\\[$uroven]\\ $text\n";
  close HND;
  if ($superlog){$superlog_tmp="$superlog_tmp\\[$uroven]\\ $text <BR>";}
 }
}


# ADD MODULE
###############
sub add_module
{
 my($tempposition,$name,@variables) = @_;
 my $mdl_output;
 do "$name.mdl";
 if ($mdl_output=&ModulAdd(@variables))
 {
  $html_write{$tempposition}="$html_write{$tempposition}$mdl_output";
 }
 undef &ModulAdd;
 my $length=length($mdl_output);
 &save_log(2,"+\"$name.mdl\" [$tempposition][$length]");
}



###############
#
###############

my $req=FCGI::Request();
local $fastcount;

while ($req->Accept() >= 0)
{
 $fastcount++;
 &StartScript_new;
}

sub StartScript_new
{
 my $time_start=(times)[0]; # START COUNTING TIME

 # RELATIVE
 ############################
 my $html_temp=$HTML_TEMP;

 # TIME
 ############################
 local $current_time=time;
 local ($Tsec, $Tmin, $Thour, $Tmday, $Tmom, $Tyear, $Twday, $Tyday,
$Tisdst)=localtime($current_time);
 local $Wsec=$Tsec;local $Wmin=$Tmin;local $Whour=$Thour;local $Wmday=$Tmday;local
$Wmom=$Tmom+1;
 local $Wyear=$Tyear+1900;
 if ($Wsec<10){$Wsec="0$Wsec"}
 if ($Wmin<10){$Wmin="0$Wmin"}
 if ($Whour<10){$Whour="0$Whour"}
 if ($Wmday<10){$Wmday="0$Wmday"}
 if ($Wmom<10){$Wmom="0$Wmom"}

 # LOCAL
 ############################
 local $superlog_tmp;
 local %form;
 local %cookie;
 local %html_write;
 local $dbh = Mysql->Connect($db_host,$db_name,$db_user,$db_pass);


 # MY
 ############################
 my $key;
 my $length;

 

 &save_log(0,"START [$$][$fastcount/$max_count]");
 &GetQueryString;
 if(!$form{type}){$form{type}="first";}
 &GetCookie;foreach $key (keys %cookie){&save_log(3,"get_cookie '$key'=\"$cookie{$key}\"");}
 
 # START BASE MODULE'S
 &add_module('00-01',"_check_online");
 if ($superlog){&add_module('99-99',"_superlog")};

 do "type_$form{type}.mdl";
 &BaseModul;undef &BaseModul;
 # All others modules is in &BaseModul {&add_module...,&add_module...
 etc...}


 # CREATE HTML
 ############################
 foreach $key (sort keys %html_write)
 {
  if (not $html_temp=~s|<%TMP$key%>|$html_write{$key}|g)
  {
   $length=length($html_write{$key});&save_log(0,"! insert ok '$key' [$length chars]");
  }
  else
  {
   $length=length($html_write{$key});&save_log(4,"-> bad insert! '$key' [$length chars]");
  }
 }


 # SEND COOKIE
 ############################
 $cookie{name}="i-laskanie";
 &SetCookie("-1","$host","/","0");
 foreach $key (keys %cookie){&save_log(3,"set_cookie '$key'=\"$cookie{$key}\"");}

 # COUNT END, LOG END
 ############################
 my $time_end=(times)[0]-$time_start; # END COUNTING TIME
 my $memory_end=`ps -p $$ -o vsz=`;$memory_end=~s|[\n\r ]||g;
 $length=length($html_temp);
 &save_log(0,"END [$$][$current_time][$time_end][$length
chars][$memory_end/$max_memory]\n\n");

 # SEND HTML
 ############################
 if ($superlog){$html_temp=~s|<%SUPERLOG%>|$superlog_tmp|g;}
 &PrintHeader;
 print $html_temp;

 # UNDEF
 ############################
 undef %form;
 undef %cookie;
 undef $dbh;

 # RELOAD
 ############################
 if (($fastcount>$max_count)||($memory_end>$max_memory))
 {&save_log(0,"RELOAD [$current_time][$$-$memory_end/$max_memory]\n\n");&fcgi_exit;}

}

> and this is "base_clanky_big.mdl" linket by sub
> &add_module(x,'base_clanky_big');

sub ModulAdd
{

##############################
# LOCAL VARIABLES FOR MODULE
##############################

my $mdl_temp;
my $mdl_temp_line=<<"HEADER";

        <table border=0 cellpadding=2 cellspacing=0 width=100% bagcolor=#86A3BA>
         <tr>
          <td valign=top>
<!--IMAGE-->
          </td>
          <td valign=top><DIV align=justify>
           <a href="index.pl?type=clanky&id=<!--ID-->">
<font color=#002F5A size=3 face=Arial><b><!--TITLE--><BR></b></font>
           </a>
<font face=Arial size=2><!--TINY--></font>
          </DIV></td>
         </tr>
        </table>
<BR>
HEADER

my $db_micro;
my $db_micro1;
my %db_micro_line;
my %db_micro1_line;
my $nullid;
my %ref;

###############################
# START VARIABLES MANIPULATION
###############################

 $db_micro = $dbh->Query("SELECT ID,starttime,author,tiny,title,image FROM clanky WHERE
starttime<$current_time AND active='Y' AND typeview='B' ORDER BY starttime DESC LIMIT 1");
 if (@db_micro_line=$db_micro->FetchRow())
 {
  $mdl_clanok_big_no=$db_micro_line[0];
  $mdl_temp="$mdl_temp$mdl_temp_line";
  $mdl_temp=~s|<!--TITLE-->|$db_micro_line[4]|g;
  $mdl_temp=~s|<!--TINY-->|$db_micro_line[3]|g;
  $mdl_temp=~s|<!--ID-->|$db_micro_line[0]|g;
  $nullid=$db_micro_line[0];
  if ($nullid<10){$nullid="0$nullid"};
  if ($nullid<100){$nullid="0$nullid"};
  if ($nullid<1000){$nullid="0$nullid"};
  if ($nullid<10000){$nullid="0$nullid"};
  if ($nullid<100000){$nullid="0$nullid"};
  $mdl_temp=~s|<!--NULLID-->|$nullid|g;


  @ref=split(',',$db_micro_line[5]);
  $nullid=$ref[0];
  if ($nullid<10){$nullid="0$nullid"};
  if ($nullid<100){$nullid="0$nullid"};
  if ($nullid<1000){$nullid="0$nullid"};
  if ($nullid<10000){$nullid="0$nullid"};
  if ($nullid<100000){$nullid="0$nullid"};
  if ($nullid<1000000){$nullid="0$nullid"};


  $db_micro1 = $dbh->Query("SELECT ID,small_120x160,original FROM photogallery WHERE
ID='$ref[0]' LIMIT 1");
  if (@db_micro1_line=$db_micro1->FetchRow())
  {
   if ($db_micro1_line[1] eq "Y")
   {
    @ref=split('x',$db_micro1_line[2]);
    @ref=&image_size($ref[0],$ref[1]);
    $mdl_temp=~s|<!--IMAGE-->|<a href="javascript://"
onclick='window.open("img.pl?id=$nullid&popis=$db_micro_line[4]","imageWin","width=$ref[0],
height=$ref[1], $ref[2], resizable=no")'><img src="$dir_d/gallery/$nullid-120x160.jpg"
width=120 height=160 align=left border=1></a>|g;
   }
   else
   {
    $mdl_temp=~s|<!--IMAGE-->|<img src="$dir_d/gallery/$nullid-120x160.jpg" width=120
height=160 align=left border=1>|g;
   }
  }
  else
  {
   $mdl_temp=~s|<!--IMAGE-->|<img src="$dir_d/gallery/0000000-120x160.jpg" width=120
height=160 align=left border=1>|g;
  }


 }

 undef %db_micro_line;
 undef %db_micro1_line;
 undef %ref;
 return $mdl_temp}  

:
:..                      Roman Fordinal
:.: fordinal@slovanet.sk




nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About