Archívum - Aug 17, 2005
Perl CGI probléma: végtelen ciklusba kerül a progi
Üdv!
Adott egy webes termékkatalógus, amely Perl-ben íródott, MySQL adatbázist használ (természetesen DBI csomagon keresztül). A nagy baj az, hogy egy bizonyos kódrészben, egy adott termék/termékcsoport lekérdezésekor végtelen ciklusba esik és iszonyú gyorsan hízlalja az Apache error-logját, valamint megeszi az erőforrásokat, ezért nemegyszer elérhetetlenné vált már a szerver.
A kérdéses kódrészlet:
A log pedig ilyenkor ezzel van tele:
Megjegyzés: a 139-ik sor a for cikluson belüli
Nem vagyok Perl-ben jártas, de a logban azt látom, hogy a $sth objektum fetchrow_array metódusa a $sth->execute()-t hiányolja, holott az a 129-ik sorban meghívásra kerül, még a ciklusba belépés előtt. Sajnos a hiba futásidejű és nem mindig jön elő, de ha előjön akkor az Apache error.log néhány óra alatt 8-10 Gigásra(!) hízik tele a fenti üzenettel...
Megjegyzem még egy ilyen rutin van a programban, ami ugyan ritkábban de szintén produkál ilyen végtelen ciklust.
Perl,CGI guruk help plz!
■ Adott egy webes termékkatalógus, amely Perl-ben íródott, MySQL adatbázist használ (természetesen DBI csomagon keresztül). A nagy baj az, hogy egy bizonyos kódrészben, egy adott termék/termékcsoport lekérdezésekor végtelen ciklusba esik és iszonyú gyorsan hízlalja az Apache error-logját, valamint megeszi az erőforrásokat, ezért nemegyszer elérhetetlenné vált már a szerver.
A kérdéses kódrészlet:
$statement = "select distinct Adatnev, Adatmertegys from gepadatok, termekek where termekek.Tipus = gepadatok.Tipus and termekek.Alcsoport=$menucsop";
$sth = $dbh->prepare($statement) or &error('database_prepare');
$sth->execute or &error('database_execute');
@row=$sth->fetchrow_array;
$returned_rows = $sth->rows;
@Cimkek = ();
$chossz = @Cimkek;
for ($i = 1; $i <= $returned_rows; $i++)
{
$Cimkek[$chossz][0] = $row[0];
$Cimkek[$chossz][1] = $row[1];
$chossz++;
@row=$sth->fetchrow_array;
}
$sth = $dbh->prepare($statement) or &error('database_prepare');
$sth->execute or &error('database_execute');
@row=$sth->fetchrow_array;
$returned_rows = $sth->rows;
@Cimkek = ();
$chossz = @Cimkek;
for ($i = 1; $i <= $returned_rows; $i++)
{
$Cimkek[$chossz][0] = $row[0];
$Cimkek[$chossz][1] = $row[1];
$chossz++;
@row=$sth->fetchrow_array;
}
A log pedig ilyenkor ezzel van tele:
[Wed Aug 17 05:37:26 2005] [error] [client 11.22.33.44] DBD::mysql::st fetchrow_array failed: fetch() without execute() at /var/httpd/html.xyz/katalogus/katalogus.pl line 139.
Megjegyzés: a 139-ik sor a for cikluson belüli
@row=$sth->fetchrow_array;
sort jelenti.Nem vagyok Perl-ben jártas, de a logban azt látom, hogy a $sth objektum fetchrow_array metódusa a $sth->execute()-t hiányolja, holott az a 129-ik sorban meghívásra kerül, még a ciklusba belépés előtt. Sajnos a hiba futásidejű és nem mindig jön elő, de ha előjön akkor az Apache error.log néhány óra alatt 8-10 Gigásra(!) hízik tele a fenti üzenettel...
Megjegyzem még egy ilyen rutin van a programban, ami ugyan ritkábban de szintén produkál ilyen végtelen ciklust.
Perl,CGI guruk help plz!
Turning Wordpress into a tag-based blogging application
Címkézés beállítása WordPressben
■ A comparison of Django with Rails
A Rails és a Django keretrendszerek összehasonlítása
■