ugrás a tartalomhoz

Perl CGI probléma: végtelen ciklusba kerül a progi

Vales_73 · 2005. Aug. 17. (Sze), 09.54
Ü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:
$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;
  }


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!
 
1

Memória

Poetro · 2005. Aug. 17. (Sze), 11.24
Nem lehet hogy túl nagy a Cikkek tömbben eltárolnadó adat? Hány eredménye van a lekérdezésednek, és egy sor kb mekkora memóriát emészt fel?
--------
Poetro
2

Ennek utána járok

Vales_73 · 2005. Aug. 17. (Sze), 12.47
Az az igazság, hogy ezt a cuccot NEM én írtam, hanem a nyakamba szakadt (megörököltem egy már nem itt dolgozótól) sajnos... Én PHP-ban csináltam volna, azzal még nem volt ilyen problémám.
Hozzávetőlegesen egy termékcsoportban maximum 10-15 termék van, attól többet nem láttam benne.
Azt, hogy egy sor mennyi memóriát foglal el, arra van valami módszer? Vagy - lehet hülye kérdés - egy karakterre egy bájtot számolva minden mezőben???! Lehet tekerhetek egyet lamacounter-en megint ? :-)
Az új szerver, amin fut, abban 768MB RAM van és 3GHz-es P4. Ez még nem állt le tőle, de a logok itt is híznak, ha beindul.

"A tiltakozás az újdonság négyzetével arányos." (Egely György)