Author Topic: Allowed memory size exhausted  (Read 1137 times)

0 Members and 1 Guest are viewing this topic.

Offline Nawid

  • Newbie
  • *
  • Posts: 2
Allowed memory size exhausted
on: Thu, 19. July 2007 - 12:01:27
Hallo,

habe noch nicht sehr viel Erfahrung mit vlib, bin aber soweit recht angetan.
jetzt stürzt mir das script immer ab wenn ein weiterer loop hinzu kommt.
hier die fehler meldung:
Allowed memory size of 33554432 bytes exhausted...

Gibt es eine begrenzte Anzahl von Loops die ich starten kann? Habe derzeit 9 im Script, 8 würden noch gehen.

vg
Nawid

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: Allowed memory size exhausted
Reply #1 on: Thu, 19. July 2007 - 12:41:02
Allowed memory size of 33554432 bytes exhausted

Das ist kein vLIB-Fehler, sondern Dein PHP hat ein "memory_limit" von 32MB. Das ist sehr viel und muss eigentlich ausreichen. Das spricht dafür, dass Deine LOOP-Arrays sehr groß sind. Wahrscheinlich sind Deine PHP-Coding-Strukturen schlecht und die Arrays sind nicht richtig aufgebaut oder ... oder ... oder
Du solltest evtl. für dieses Skript kein vLIB verwenden oder Deine Codingstrukturen optimieren. Zum Beispiel ist es Unsinn einen Array mit 20.000 Datensätzen anzulegen, weil die Ausgabe sich eh kein Mensch ansieht.

Hier ein Skript, wie man es performant macht:
Ausgabe aller Datensätze dieses Forums mit Blätternfunktion

Wenn Du nicht weißt, was Du am PHP-Code optimieren sollst, musst Du für dieses Skript auf die
Template Engine nur mit PHP
umsteigen. Aber auch dann fliegt Dir der Code früher oder später um die Ohren. Ich habe es in keinem meiner PHP-Skripte und auch nicht meinen vLIB-Skripten geschafft, ein "memory_limit" von 2MB zu sprengen. Allerdings halte ich mich auch an den PHP Coding Standard.

Gruß
Claus
Last Edit: Thu, 19. July 2007 - 12:49:10 by ClausVB

Offline Nawid

  • Newbie
  • *
  • Posts: 2
Re: Allowed memory size exhausted
Reply #2 on: Thu, 19. July 2007 - 13:41:47
Hi Claus,

das traurige ist ja das die Loops eigentlich relativ klein sind. Allerdings kommen insgesamt 8 Loops zusammen in einer Datei.
Code: [Select]
$table_data1 = array();
$sql1 = "SELECT id, kategorie, title FROM posts WHERE kategorie < 20 AND kategorie > 10 ORDER BY id DESC LIMIT 9";
$query1 = mysql_query($sql1, $conn)
or die(mysql_errno().": ".mysql_error());
while ($row = mysql_fetch_assoc($query1))
{
array_push($table_data1, array  (
"id" => $row["id"],
"title" => $row["title"]
)
  );
}

$tmpl->setLoop("table_data1", $table_data1);

In der Tabelle posts sind knapp 300 Datensätze. Insgesamt 8 Loops zu dem Thema.
Dazu kommen noch 7 mal solche Abfragen:
Code: [Select]
$sql11 = "SELECT id, title, intro FROM posts WHERE id = 3";
$query11 = mysql_query($sql11, $conn)
or die(mysql_errno().": ".mysql_error());
$row11 = mysql_fetch_assoc($query11);

$tmpl->setVar("futitle", $row11["title"]);
$tmpl->setVar("fuintro", cut_text(($row11["intro"]), 200));
$tmpl->setVar("fuid", $row11["id"]);

Sprengen diese Abfragen die Memory? Nach dem query habe ich es mit mysql_free_result versucht, was nichts bringt.
Nur diese Datei beinhaltet soviele Abfragen, da sie die Startseite bildet.

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: Allowed memory size exhausted
Reply #3 on: Thu, 19. July 2007 - 14:41:15
Das ist ein PHP-Problem.

Ich habe mit vLIB schon (aus Versehen) mal über 6.000 Datensätze in eine Tabelle ausgegeben. Mein Shadowrun-Charakterblatt Generator enthält über 12 Loops (mit mindestens 4, maximal 12 Datensätzen).

Ich habe allerdings auch schon mal in einer WHILE-Schleife die ca. 500 Mal gelaufen ist jeweils die Instanz
Code: [Select]
include vlibDate.php;
$date = new vlibDate(de);
gebildet. Das ist aber dann auch ein Programmierfehler, da er 500x die Datei inkludiert und 500x die Instanz bildet. Das kostet eben Speicher.

Da Du Dich nicht an den PHP Coding Standard hälst (siehe Variablennamen wie >$table_data1< und >$row11["title"]<) gehe ich von fehlerhafter PHP-Programmierung aus und schließe den Thread. Es scheint fast so, als würdest Du sogar Grundlagen wie Unterschiede zwischen >$row11["title"]< und >$row11[title]< nicht wissen. PHP Grundlagen sind hier aber Voraussetzung, bevor man fragt.

Gruß
Claus
Last Edit: Thu, 19. July 2007 - 14:44:23 by ClausVB