Memory Limitation

Loveboat

Erfahrenes Mitglied
Hallo zusammen,

habe, wie fast alle hier :), ein kleines Problem.

ich habe mir ein Script geschrieben welches aus Bildern schöne kleine Thumbs erstellt. Das Script funktioniert auch soweit fehlerfrei.

Allerdings erhalte ich seit neustem folgende Fehlermeldung:

Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 10368 bytes) in /mnt/web4/42/95/51325995/htdocs/php/view_301.php on line 93

In Zeile 93 und 94 habe ich folgenden Code:

PHP:
$altesBild = ImageCreateFromJPEG("$path"."$image");
$neuesBild = imagecreatetruecolor($neueBreite,$neueHoehe);


Dies funktioniert wie gesagt auf anderen Seite fehlerfrei. Nur warum auf der einen Seite nicht?

Habe daraufhin mal mit
PHP:
phpinfo();
die Werte ausgelesen und eine interessante Zeile im bereich "Configuration - PHP Core" gefunden:

memory_limit 20M 20M

Was sagt diese Zeile denn aus Denn 20MB = 20971520 Byte und diese Menge scheint überschritten zu sein.

Achja, mein Provider ist Strato.

Vielleicht weiß jemand was hier los ist.

Danke schon mal.

Gruß
Loveboat
 
Aaah,

hab schon was gefunden.

memory_limit integer
Setzt den Maximalwert des Speichers in Byte, den ein Skript verbrauchen darf. Damit können schlecht geschriebene Skripte daran gehindert werden, den gesamten verfügbaren Speicher eines Servers "aufzufressen". Um diese Option nutzen zu können, muss sie während des Kompilierens aktiviert werden. D.h., Ihre Konfigurations-Zeile muss folgendes enthalten: --enable-memory-limit. Beachten Sie, dass Sie den Wert auf -1 setzen müssen, wenn Sie kein Speicherlimit wünschen.

Seit PHP 4.3.2 und wenn memory_limit aktiviert ist, steht die PHP Funktion memory_get_usage() zur Verfügung.

Wird ein integer Wert verwendet, wird dieser Wert in Bytes gemessen. Sie können auch die Kurzschreibweise verwenden, wie in dieser FAQ beschrieben.

Aber wie bekomm ich diesen Speicher wieder frei

Gruß
Loveboat
 
ok, klingt gut diese Funktion. Aber wann benutze ich diese? Nachdem die Seite angezeigt wurde? Ist dies nur ein temporärer Speicher?
 
OK, hier mal mein code welches die Funktionen imageCreate beinhaltet.
Wer kann mir sagen wo und wie ich "imagedestroy()" anwenden muss?

PHP:
				$sql1 = "SELECT DISTINCT * FROM pictures WHERE id='$zeile[$nr]'";
				$result = mysql_query($sql1);
				while($mygrp = mysql_fetch_assoc($result))
					{
					$path = $mygrp["path"];
					$image = $mygrp["image"];
					$filesize = filesize($path.$image);
					$filesize = round($filesize/1024);
					$size = getimagesize("$path"."$image");
					$breite = $size[0]; 
					$hoehe = $size[1];
					if($breite > $hoehe)
						{
						if($breite/$hoehe < 100/75)
							{
							$neueHoehe = 75;
							$neueBreite = intval($neueHoehe*$breite/$hoehe);
							}
						if($breite/$hoehe >= 100/75)
							{
							$neueBreite = 100;
							$neueHoehe = intval($hoehe*$neueBreite/$breite);
							}
						}
					elseif($hoehe > $breite)
						{
						$neueHoehe = 75;
						$neueBreite = intval($neueHoehe*$breite/$hoehe);
						}
					elseif($hoehe == $breite)
						{
						$neueBreite = 75;
						$neueHoehe = 75;
						}
					else
						{
						$neueBreite = 0;
						$neueHoehe = 0;
						}
					$altesBild = ImageCreateFromJPEG("$path"."$image"); 
					$neuesBild = imagecreatetruecolor($neueBreite,$neueHoehe); 
					imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
					$fh=fopen("$path"."thumbs/"."$image",'w');
					fclose($fh);
					ImageJPEG($neuesBild,"$path"."thumbs/"."$image"); 
					$Thumbnail=$path."thumbs/".$image;
					echo '<td width="120" align="center" height="120" background="../pics/foto1bgd.jpg">
							<table border="0" width="120" cellspacing="0" cellpadding="0">
								<tr>
									<td width="120" height="75"><img border="0" src="'.$Thumbnail.'" width="'.$neueBreite.'" height="'.$neueHoehe.'" alt="'.$image.'"></td>
								</tr>
								<tr>
									<td width="120" height="4"></td>
								</tr>
								<tr>
									<td width="120" height="25" align="center">
									<table border="0" cellspacing="0" cellpadding="0">
										<tr>
											<td width="25" height="25"><img border="0" src="pics/lupe.jpg" width="25" height="25" alt="Zoom In" onclick="window.open(\''.$path.$image.'\')" style="cursor:pointer"></td>
											<td height="25" class="cenFont5">&nbsp;Zoom In<br>&nbsp;('.$filesize.'&nbsp;kB)</td>
										</tr>
									</table>
									</td>
								</tr>
							</table>
						</td>';
					if($y < 2)
						echo '<td width="20" align="center" height="120"></td>';
 
Gib am Ende jedes Durchlaufs die reservierten Ressourcen wieder frei, also:
PHP:
while( $mygrp = mysql_fetch_assoc($result) ) {
	/* … */
	imagedestroy($altesBild);
	imagedestroy($neuesBild);
}
 
Zurück