Seite 1 von 1

Fatal error: Allowed memory size of 33554432 bytes exhausted

Verfasst: 06.12.2008 17:05
von FCM
Hallo,

ich habe ein Skript, welches Text zu meiner Handschrift umwandelt. Dazu habe ich 52 kleine Bilddateien (26 für Großbuchtstaben und 26 für Kleinbuchtstaben). Die Zeichen (ABC ..., abc ...) werden einzeln ersetzt. Doch bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 18816541 bytes) in *** on line 37
Warum? Hier der Code:

Code: Alles auswählen

<?php

$mode = $_GET['mode'];

if ($mode == 'do_it') {
	$text = $_POST['text'];
	$p = 0.3;
	
	$i_size = array('./gross/space.gif', './gross/a.gif', './gross/b.gif', './gross/c.gif', './gross/d.gif', './gross/e.gif', './gross/f.gif', 
				'./gross/g.gif', './gross/h.gif', './gross/i.gif', './gross/j.gif', './gross/k.gif', './gross/l.gif',
				'./gross/m.gif', './gross/n.gif', './gross/o.gif', './gross/p.gif', './gross/q.gif', './gross/r.gif',
				 './gross/s.gif', './gross/t.gif', './gross/u.gif', './gross/v.gif', './gross/w.gif', './gross/x.gif',
				  './gross/y.gif', './gross/z.gif'
	);
				  
	$i_size2 = array('./klein/a.gif', './klein/b.gif', './klein/c.gif', './klein/d.gif', './klein/e.gif', './klein/f.gif',
				  './klein/g.gif', './klein/h.gif', './klein/i.gif', './klein/j.gif', './klein/k.gif', './klein/l.gif', './klein/m.gif', './klein/n.gif', 
				  './klein/o.gif', './klein/p.gif', './klein/q.gif', './klein/r.gif', './klein/s.gif', './klein/t.gif', './klein/u.gif', './klein/v.gif', 
				  './klein/w.gif', './klein/x.gif', './klein/y.gif', './klein/z.gif'
	);
	
	$r = array(' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
	$r2 = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
	
	$num = 0;
	
	while ($num <= 27) {
		$size = getimagesize($i_size[$num]);
		$text = str_replace($r[$num], '<img style="width: ' . $size[0] * $p . 'px; height: ' . $size[1] * $p . 'px;" src="' . $i_size[$num] . '" />', $text);
		$num++;
	}
	
	$num2 = 0;
	
	while ($num2 <= 26) {
		$size = getimagesize($i_size2[$num2]);
		$text = str_replace($r2[$num2], '<img style="width: ' . $size[0] * $p . 'px; height: ' . $size[1] * $p . 'px;" src="' . $i_size[$num2] . '" />', $text);
		$num2++;
	}
	
	echo nl2br($text);
	
}

?>

Verfasst: 06.12.2008 21:50
von Boecki91
Das Bild wird größer als der zur Verfügung stehende Arbeitsspeicher von ca. 32MB, oder die Anzahl der eingelesenen Bilder. Auf jeden Fall zu Viel

Dachte eigendlich das du sowas mit Google herausfinden kannst :roll:

Vielleicht die größe als Festwert speichern?

Verfasst: 06.12.2008 23:33
von djchrisnet
einfach $size wieder freigeben nachdem du die daten eingefügt hast..
$text = .......;
unset($size);

Verfasst: 06.12.2008 23:37
von FCM
Genau. Und wenn ich den Memory erhöhe (sogar auf 6000M) ändert sich auch nichts.

Verfasst: 06.12.2008 23:41
von FCM
Hatte ich auch schon probiert, half und hilft aber leider nicht. Wenn ich das str_replace() nicht mache, kommt auch der Fehler nicht.

(Sorry für den Doppelpost, er hat editiert)

Verfasst: 06.12.2008 23:50
von atrox
Ändert sich etwas, wenn du den Wert direkt in der Datei zuweist?

Verfasst: 07.12.2008 00:33
von piero
da ist ein kleiner denkfehler drin... ;)

angenommen du gibst deinem script den text "a"

dieser wird nun im ersten durchlauf (buchstabe a)ersetzt durch '<img style="width:1px;height:1px" src="/klein/a.gif" />'

dann bekommst du für den zweiten durchlauf (buchstabe b) zwar keine ersetzung...
dafür wird beim dritten durchlauf (buchstabe c) das c bei "src=" ersetzt durch dein bild, was ja nicht sein sollte ;)
usw...

nimm die funktion strtr() und ersetze alles in einem mal, dann wird das gemacht, was du willst ;)
Wenn der Aufruf mit zwei Argumenten durchgeführt wird, verhält sich die Funktion anders: from muss nun ein Array sein, das string -> string-Paare enthält, die im Originalstring ersetzt werden sollen. strtr() tauscht dabei zuerst die längsten möglichen Treffer aus und verändert bereits durchgeführte Ersetzungen *NICHT*.
folglicherweise die funktion so benutzen:

Code: Alles auswählen

$l = array('a' => './klein/a.gif', 'b' => './klein/b.gif', .... , 'Z' => './gross/z.gif')
$text = strtr($text, )
wichtig: die funktion nicht ein zweites mal auf den gleichen text anwenden ;)

Verfasst: 07.12.2008 00:34
von Miriam
Du hast eine Schleife gebaut, da Du $text mehrfach zugewiesen hast und in der WHILE-Schleife immer wieder einen neuen Wert gibst. Benutze in der Schleife meinetwegen $text_img oder was Dir am besten gefällt.
Ausserdem änderst Du die Änderungen beim folgendenden Durchlauf gleich wieder.
So kann es klappen:

Code: Alles auswählen

<?php
$text = $_GET['text'];
$repl = array(	'a' => '<img src="./klein/a.gif">',
				'b' => '<img src="./klein/b.gif">',
				'c' => '<img src="./klein/c.gif">',
				'd' => '<img src="./klein/d.gif">',
				'e' => '<img src="./klein/e.gif">',
				'f' => '<img src="./klein/f.gif">',
				'g' => '<img src="./klein/g.gif">', 
				'h' => '<img src="./klein/h.gif">', 
				'i' => '<img src="./klein/i.gif">', 
				'j' => '<img src="./klein/j.gif">', 
				'k' => '<img src="./klein/k.gif">', 
				'l' => '<img src="./klein/l.gif">',
				'm' => '<img src="./klein/m.gif">',
				'n' => '<img src="./klein/n.gif">',
				'o' => '<img src="./klein/o.gif">',
				'p' => '<img src="./klein/p.gif">',
				'q' => '<img src="./klein/q.gif">', 
				'r' => '<img src="./klein/r.gif">',
				's' => '<img src="./klein/s.gif">',
				't' => '<img src="./klein/t.gif">',
				'u' => '<img src="./klein/u.gif">',
				'v' => '<img src="./klein/v.gif">',
				'w' => '<img src="./klein/w.gif">',
				'x' => '<img src="./klein/x.gif">',
				'y' => '<img src="./klein/y.gif">',
				'z' => '<img src="./klein/z.gif">',
				'A' => '<img src="./gross/a.gif">',
				'B' => '<img src="./gross/b.gif">',
				'C' => '<img src="./gross/c.gif">',
				'D' => '<img src="./gross/d.gif">',
				'E' => '<img src="./gross/e.gif">',
				'F' => '<img src="./gross/f.gif">',
				'G' => '<img src="./gross/g.gif">', 
				'H' => '<img src="./gross/h.gif">', 
				'I' => '<img src="./gross/i.gif">', 
				'J' => '<img src="./gross/j.gif">', 
				'K' => '<img src="./gross/k.gif">', 
				'L' => '<img src="./gross/l.gif">',
				'M' => '<img src="./gross/m.gif">',
				'N' => '<img src="./gross/n.gif">',
				'O' => '<img src="./gross/o.gif">',
				'P' => '<img src="./gross/p.gif">',
				'Q' => '<img src="./gross/q.gif">', 
				'R' => '<img src="./gross/r.gif">',
				'S' => '<img src="./gross/s.gif">',
				'T' => '<img src="./gross/t.gif">',
				'U' => '<img src="./gross/u.gif">',
				'V' => '<img src="./gross/v.gif">',
				'W' => '<img src="./gross/w.gif">',
				'X' => '<img src="./gross/x.gif">',
				'Y' => '<img src="./gross/y.gif">',
				'Z' => '<img src="./gross/z.gif">'
			);
echo strtr($text, $repl);			
?>

//Edit: Zu Spät.

Verfasst: 07.12.2008 09:42
von FCM
Ach jetzt verstehe ich ... . Vielen Dank. Klar, er ersetzt zwar, findet allerdings wieder Buchstaben von dem HTML-Code und ersetzt unendlich lange. Somit bringt es auch nichts, den Memory hochzudrehen.

Vielen Dank für eure Antworten!

Verfasst: 08.12.2008 22:09
von Boecki91
Wenn du das Limit auf 600M hochstellst stößt du aber auch irgendwo an Grenzen ;) Irgendwann hast du keinen RAM Riegel mehr frei ;)