Gå til innhold

Store problemer med GD og apache2 crash:S


Anbefalte innlegg

Hei, jeg har store problemer med at Apache2 crasher med kun denne feilmeldingen:

gd-jpeg error: cannot allocate gdImage struct

 

Jeg kjører apache2 på ubuntu(vps)

 

jeg regner med at feilen er i denne koden(eneste plassen jeg bruker GD)

 

dessuten, det kan se ut som feilen er periodisk, men aner ikke hvor den slutter og virke:S

 

takker for all hjelp, jeg aner ikke hva jeg har gjort galt:S

 

 

<?php
function open_image ($file) {
	# JPEG:
	$im = @imagecreatefromjpeg($file);
	if ($im !== false) { return $im; }

	# GIF:
	$im = @imagecreatefromgif($file);
	if ($im !== false) { return $im; }

	# PNG:
	$im = @imagecreatefrompng($file);
	if ($im !== false) { return $im; }

	# GD File:
	$im = @imagecreatefromgd($file);
	if ($im !== false) { return $im; }

	# GD2 File:
	$im = @imagecreatefromgd2($file);
	if ($im !== false) { return $im; }

	# WBMP:
	$im = @imagecreatefromwbmp($file);
	if ($im !== false) { return $im; }

	# XBM:
	$im = @imagecreatefromxbm($file);
	if ($im !== false) { return $im; }

	# XPM:
	$im = @imagecreatefromxpm($file);
	if ($im !== false) { return $im; }

	# Try and load from string:
	$im = @imagecreatefromstring(file_get_contents($file));
	if ($im !== false) { return $im; }

	return false;
}


$dir = '/home/hagen/Bilder/';
$cDir = $_GET['album'];
$file = $_GET['file'];
$filename = $dir.$cDir.$file;
if (isset($_GET['upload']) and $_GET['upload'] == 1) $filename = '/home/hagen/upload/'.$file;
if (isset($_GET['web']) and $_GET['web'] == 1) $filename = '/home/hagen/hagen.vg/'.$file;

$ext = substr(strrchr($filename, '.'), 1);
$ext = strtolower($ext);
header("Pragma: cache");
if ($ext == 'jpg' or $ext == 'png' or $ext == 'jpeg' or $ext == 'gif' or $ext == 'bmp' or $ext == 'thm') {
header("Content-type: image/$ext");
$image = open_image($filename);
if ($image === false) { die ('Kunne ikke åpne bildet.'); }


$desiredwidth = 790;
$originalwidth = imagesx($image);
$originalheight = imagesy($image);
$ratio = $originalwidth / $desiredwidth;
$desiredheight = $originalheight / $ratio;

$thumb_ratio = $originalheight / 100;
$thumb_width = $originalwidth / $thumb_ratio;
$thumb_height = 100;

$bthumb_width = 150;
$bthumb_ratio = $originalwidth / $bthumb_width;
$bthumb_height = $originalheight / $bthumb_ratio;

if (isset($_GET['size'])) {
	if ($_GET['size'] == 'full') {
		if (isset($_GET['tekst'])) {
			$x = strpos($file, '.'); 
			$tmp_file = $_GET['tekst'];
			$test_file = $dir.$cDir.'/'.substr($tmp_file, 0, $x+3).'.THM';
			if (file_exists($test_file)) $image = open_image($test_file);

			$text_color = imagecolorallocate($image, 233, 14, 91);
			imagestring($image, 5, 0,0,$tmp_file, $text_color);
			imagejpeg($image);
		} else {
			imagejpeg($image);
		}
	} else if ($_GET['size'] == 'site') {
		$image_resized = imagecreatetruecolor($desiredwidth, $desiredheight);
		imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $desiredwidth, $desiredheight, $originalwidth, $originalheight);
		imagejpeg($image_resized);
	} else if ($_GET['size'] == 'thumb') {
		$image_resized = imagecreatetruecolor($thumb_width, $thumb_height);
		imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $originalwidth, $originalheight);
		imagejpeg($image_resized);
	} else if ($_GET['size'] == 'bigthumb') {
		$image_resized = imagecreatetruecolor($bthumb_width, $bthumb_height);
		imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $bthumb_width, $bthumb_height, $originalwidth, $originalheight);
		imagejpeg($image_resized);
	} else {
		imagejpeg($image);
	}
} else {
	readfile($dir.$cDir.$file);
}
} else if ($ext=='avi' or $ext == 'mov') {
if  ($_GET['size'] == 'bigthumb') {
		header("Content-type: image/jpeg");

		$image_resized = imagecreatetruecolor(150, 100);
		$text_color = imagecolorallocate($image_resized, 233, 14, 91);
		imagestring($image_resized, 5, 5, 5,  "Film", $text_color);
		imagepng($image_resized);
		imagedestroy($image_resized);

}else {
	$fp = fopen($filename, 'rb');

	header("Content-type: video/divx");
	if ($ext == 'mov') header("Content-type: video/quicktime");
	header("Content-Length: " .(string)(filesize($filename)) );
	header('Content-Disposition: attachment; filename="'.$file.'"');
	header("Content-Transfer-Encoding: binary\n");

	if($fp = fopen($filename, 'rb')){
		while( (!feof($fp)) && (connection_status()==0) ){
			print(fread($fp, 1024*8));
			flush();
		}
		fclose($fp);
	}
	return((connection_status()==0) and !connection_aborted());
	}	
} else {
//filename is not JPG or AVI
header("Content-type: image/png");
readfile('Feil.png');
}
?>

 

 

[EDIT]

gd_info()

 

 

Array (

[GD Version] => 2.0 or higher

[FreeType Support] => 1

[FreeType Linkage] => with freetype

[T1Lib Support] => 1

[GIF Read Support] => 1

[GIF Create Support] => 1

[JPG Support] => 1

[PNG Support] => 1

[WBMP Support] => 1

[XPM Support] =>

[XBM Support] =>

[JIS-mapped Japanese Font Support] => )

 

 

Endret av Richard87
Lenke til kommentar
Videoannonse
Annonse

Hei, endret funksjonen til dette:

 

function open_image ($file) {
$ext = substr(strrchr($file, '.'), 1);
$ext = strtolower($ext);

switch ($ext) {
	case 'jpeg':
	case 'jpg':
		$im = @imagecreatefromjpeg($file);
		if ($im !== false) { return $im; }
		break;
	case 'gif':
		$im = @imagecreatefromgif($file);
		if ($im !== false) { return $im; }
		break;
	case 'png':
		$im = @imagecreatefrompng($file);
		if ($im !== false) { return $im; }
	case 'gd':
		$im = @imagecreatefromgd($file);
		if ($im !== false) { return $im; }
		break;
	case 'gd2':
		$im = @imagecreatefromgd2($file);
		if ($im !== false) { return $im; }
		break;
	case 'wbmp';
		$im = @imagecreatefromwbmp($file);
		if ($im !== false) { return $im; }
		break;
	case 'xbm':
		$im = @imagecreatefromxbm($file);
		if ($im !== false) { return $im; }
		break;
	case 'xpm':
		$im = @imagecreatefromxpm($file);
		if ($im !== false) { return $im; }
		break;
	default:
		$im = @imagecreatefromstring(file_get_contents($file));
		if ($im !== false) { return $im; }
		break;
}
return false;
}

 

 

men apache crasher enda:

gd-jpeg error: cannot allocate gdImage struct
gd-jpeg error: cannot allocate gdImage struct
gd-jpeg error: cannot allocate gdImage struct
[Fri Jun 27 17:59:25 2008] [warn] pid file /var/run/apache2.pid overwritten -- Unclean shutdown of previous Apache run?
[Fri Jun 27 17:59:25 2008] [notice] Apache/2.0.55 (Ubuntu) PHP/5.1.6 mod_ruby/1.2.6 Ruby/1.8.4(2005-12-24) mod_perl/2.0.2 Perl/v5.8.8 configured -- resuming normal operations

Endret av Richard87
Lenke til kommentar

Hagee ikke gjort det, mer er fikset nå..

 

Men apache crasher fortsatt:S

 

 

 

<?php
function open_image ($file) {
$ext = substr(strrchr($file, '.'), 1);
$ext = strtolower($ext);

switch ($ext) {
	case 'jpeg':
	case 'jpg':
		$im = @imagecreatefromjpeg($file);
		if ($im !== false) { return $im; }
		break;
	case 'gif':
		$im = @imagecreatefromgif($file);
		if ($im !== false) { return $im; }
		break;
	case 'png':
		$im = @imagecreatefrompng($file);
		if ($im !== false) { return $im; }
	case 'gd':
		$im = @imagecreatefromgd($file);
		if ($im !== false) { return $im; }
		break;
	case 'gd2':
		$im = @imagecreatefromgd2($file);
		if ($im !== false) { return $im; }
		break;
	case 'wbmp';
		$im = @imagecreatefromwbmp($file);
		if ($im !== false) { return $im; }
		break;
	case 'xbm':
		$im = @imagecreatefromxbm($file);
		if ($im !== false) { return $im; }
		break;
	case 'xpm':
		$im = @imagecreatefromxpm($file);
		if ($im !== false) { return $im; }
		break;
	default:
		$im = @imagecreatefromstring(file_get_contents($file));
		if ($im !== false) { return $im; }
		break;
}
return false;
}


$dir = '/home/hagen/Bilder/';
$cDir = $_GET['album'];
$file = $_GET['file'];
$filename = $dir.$cDir.$file;
if (isset($_GET['upload']) and $_GET['upload'] == 1) $filename = '/home/hagen/upload/'.$file;
if (isset($_GET['web']) and $_GET['web'] == 1) $filename = '/home/hagen/hagen.vg/'.$file;

$ext = substr(strrchr($filename, '.'), 1);
$ext = strtolower($ext);
header("Pragma: cache");
if ($ext == 'jpg' or $ext == 'png' or $ext == 'jpeg' or $ext == 'gif' or $ext == 'bmp' or $ext == 'thm') {
header("Content-type: image/$ext");
$image = open_image($filename);
if ($image === false) { die ('Kunne ikke åpne bildet.'); }


$desiredwidth = 790;
$originalwidth = imagesx($image);
$originalheight = imagesy($image);
$ratio = $originalwidth / $desiredwidth;
$desiredheight = $originalheight / $ratio;

$thumb_ratio = $originalheight / 100;
$thumb_width = $originalwidth / $thumb_ratio;
$thumb_height = 100;

$bthumb_width = 150;
$bthumb_ratio = $originalwidth / $bthumb_width;
$bthumb_height = $originalheight / $bthumb_ratio;

if (isset($_GET['size'])) {
	if ($_GET['size'] == 'full') {
		if (isset($_GET['tekst'])) {
			$x = strpos($file, '.'); 
			$tmp_file = $_GET['tekst'];
			$test_file = $dir.$cDir.'/'.substr($tmp_file, 0, $x+3).'.THM';
			if (file_exists($test_file)) $image = open_image($test_file);

			$text_color = imagecolorallocate($image, 233, 14, 91);
			imagestring($image, 5, 0,0,$tmp_file, $text_color);
			imagejpeg($image);
			imagedestroy($image);
		} else {
			imagejpeg($image);
			imagedestroy($image);
		}
	} else if ($_GET['size'] == 'site') {
		$image_resized = imagecreatetruecolor($desiredwidth, $desiredheight);
		imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $desiredwidth, $desiredheight, $originalwidth, $originalheight);
		imagejpeg($image_resized);
		imagedestroy($image_resized);
	} else if ($_GET['size'] == 'thumb') {
		$image_resized = imagecreatetruecolor($thumb_width, $thumb_height);
		imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $originalwidth, $originalheight);
		imagejpeg($image_resized);
		imagedestroy($image_resized);
	} else if ($_GET['size'] == 'bigthumb') {
		$image_resized = imagecreatetruecolor($bthumb_width, $bthumb_height);
		imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $bthumb_width, $bthumb_height, $originalwidth, $originalheight);
		imagejpeg($image_resized);
		imagedestroy($image_resized);
	} else {
		imagejpeg($image);
		imagedestroy($image_resized);
	}
} else {
	readfile($dir.$cDir.$file);
}
} else if ($ext=='avi' or $ext == 'mov') {
if  ($_GET['size'] == 'bigthumb') {
		header("Content-type: image/jpeg");

		$image_resized = imagecreatetruecolor(150, 100);
		$text_color = imagecolorallocate($image_resized, 233, 14, 91);
		imagestring($image_resized, 5, 5, 5,  "Film", $text_color);
		imagepng($image_resized);
		imagedestroy($image_resized);

}else {
	$fp = fopen($filename, 'rb');

	header("Content-type: video/divx");
	if ($ext == 'mov') header("Content-type: video/quicktime");
	header("Content-Length: " .(string)(filesize($filename)) );
	header('Content-Disposition: attachment; filename="'.$file.'"');
	header("Content-Transfer-Encoding: binary\n");

	if($fp = fopen($filename, 'rb')){
		while( (!feof($fp)) && (connection_status()==0) ){
			print(fread($fp, 1024*8));
			flush();
		}
		fclose($fp);
	}
	return((connection_status()==0) and !connection_aborted());
	}	
} else {
//filename is not JPG or AVI
header("Content-type: image/png");
readfile('Feil.png');
}
imagedestroy($image);
imagedestroy($image_resize);
?>

 

 

Lenke til kommentar

Høyst merkelig problem må jeg si. Feilmeldingen blir generert av at følgende linje gir 0 (linje 333 i gd_jpeg.c i kildekoden for PHP 5.2)

im = gdImageCreateTrueColor ((int) cinfo.image_width, (int) cinfo.image_height);

Det er vanskelig å se for seg hvordan verdien der skal bli 0 med mindre det er noe overflow e.l. på gang (iallfall ut fra den kildekoden jeg tok en titt på). Sikker på at ikke et av bildene er korrupte e.l.?

 

Det første linjene av gdImageCreateTrueColor ser forøvrig slik ut:

gdImagePtr gdImageCreateTrueColor (int sx, int sy)
{
	int i;
	gdImagePtr im;

	if (overflow2(sx, sy)) {
			return NULL;
	}

	if (overflow2(sizeof(unsigned char *), sy)) {
			return NULL;
	}

	if (overflow2(sizeof(int), sx)) {
			return NULL;
	}

Dette er de eneste mulighetene for å få NULL eller 0 siden de resterende linjene i funksjonen bare er tilordninger etc. mot struct-en (im) som da åpenbart ikke kan være NULL (ellers hadde nok programmet krasjet med en helt annen feilmelding).

Endret av Ernie
Lenke til kommentar

takker for 'informativt' svar, men jeg finner ennå ikke ut av feilen:S

 

for litt siden greide jeg og vise alle bildene i en mappe som lagre trøbbel, plutseligt så vil den ikke vise et par bilder, så tar jeg en refresh, og noen bilder kommer fram igjen, før plutselig webserveren crasher med samme feilmelding som tidligere.

 

det virker som det er helt random:S

 

den eneste forandringen jeg gjorde var og fjerne THM filer fra lista over filer som skal bli vist(denne filtypen har altid virket:S)

 

slik er skriptet som viser bildene:

 

 

<?php
function getarea($filename) {;
	$handle = fopen($filename, "rb");
	$header = fread($handle,8192);
	fclose($handle);
	$header = substr($header, strpos($header,"\r\n\r\n")+4);
	return $header;
	$values = unpack("C*", substr($header, strpos($header, 'avih8') + 40, 6));
	return array($values[1] + $values[2]*256, $values[5] + $values[6]*256);
}

include_once('auth.php');
if (isauthenticated()) {
	//list bilder/album

	$dir = '/home/hagen/Bilder/';
	$bLoad = false;
	$cDir = '';
	if (isset($_GET['file'])) {
		$bLoad = true;
	} 
	if (isset($_GET['album'])) {
		$cDir = $_GET['album'] . '/';
	}

	if ($bLoad) {
		// load picture
		$ext = strtolower(substr(strrchr($_GET['file'], '.'), 1));
		if ($ext == 'avi') {
			$ret = getarea($dir.$cDir.$_GET['file']);
			//print_r ($ret);


			$url = 'http://hagen.drachir.no/image.php?album='.$_GET['album'].'&file='.$_GET['file'];
			print('<embed type="video/divx" src="'.$url.'" pluginspage="http://go.divx.com/plugin/download/" allowscriptaccess="never" width="320" height="260">');
			print(' <a href="http://www.divx.com/divx/webplayer/"><img src="http://labs.divx.com/files/dwp-l-l.gif" border="0" /></a>');		
			print ('<br /><br /><a href="'.'index.php?page=bilder3&start='.$_GET['start'].'&count='.$_GET['count'].'&album='.$_GET['album'].'">Tilbake</a>');
		} else if ($ext == 'mov') {
			$url = 'http://hagen.drachir.no/image.php?album='.$_GET['album'].'&file='.$_GET['file'];
?>
<script src="DWConfiguration/ActiveContent/IncludeFiles/AC_ActiveX.js" type="text/javascript"></script>
<script src="DWConfiguration/ActiveContent/IncludeFiles/AC_RunActiveContent.js" type="text/javascript"></script>


<script type="text/javascript">
AC_AX_RunContent( 'classid','clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B','codebase','http://www.apple.com/qtactivex/qtplugin.cab','height','256','width','320','src','<?php print($url); ?>','autoplay','true','type','video/quicktime','pluginspage','http://www.apple.com/quicktime/download/' ); //end AC code
</script><script type="text/javascript">
AC_AX_RunContent( 'classid','clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B','codebase','http://www.apple.com/qtactivex/qtplugin.cab','height','256','width','320','src','<?php print($url); ?>','autoplay','true','type','video/quicktime','pluginspage','http://www.apple.com/quicktime/download/' ); //end AC code
</script><noscript><object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="256" width="320">

<param name="src" value="<?php print($url); ?>">
<param name="autoplay" value="true">
<param name="type" value="video/quicktime" height="256" width="320">

<embed src="<?php print($url); ?>" height="256" width="320" autoplay="true" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/">

</object></noscript>
<?php
			print ('<br /><br /><a href="'.'index.php?page=bilder3&start='.$_GET['start'].'&count='.$_GET['count'].'&album='.$_GET['album'].'">Tilbake</a>');
		} else {
			$url = 'image.php?album='.$_GET['album'].'&file='.$_GET['file'];

			print ('<a href="'.$url.'&size=full">Bilde: '.$_GET['album'].$_GET['file'].'<br>');
			print ('<img src="'.$url.'&size=site" border=0 /></a>');
			print ('<br /><br /><a href="'.'index.php?page=bilder3&start='.$_GET['start'].'&count='.$_GET['count'].'&album='.$_GET['album'].'">Tilbake</a>');
		}

	} else if ($handle = opendir($dir.$cDir)) {
		$x = 0;
		$img[0] = $_GET['album'];
		$link[0] = $_GET['album'];
		while (false !== ($file = readdir($handle))) {
			$ext = strtolower(substr(strrchr($file, '.'), 1));
			if (is_dir($dir.$file)) {
			} else {
				if ($file == '.' or $file=='..') {
				}else if($ext =='info' or $ext == 'thm' or $ext == 'THM') {
				} else {
					$x = $x + 1;
					$link2 = '<a href="index.php?page=bilder3&album='.$cDir.'&file='.$file.'&start='.$_GET['start'].'&count='.$_GET['count'].'">';	

					$ext = strtolower(substr(strrchr($file, '.'), 1));
					if ($ext == 'avi' or $ext == 'mov') { 
						$img2 = '<img src="image.php?web=1&file=movie.jpg&size=full&tekst='.$file.'&album='.$_GET['album'].'" border=0 /></a>'."\n";
					}else {	
						$img2 = '<img src="image.php?album='.$cDir.'&file='.$file.'&size=bigthumb" border=0 /></a>'."\n";
					}
					$link[$x] = $link2;
					$img[$x] = $img2;
					$max = $x;
				}
			}
		}
		closedir($handle);

		$start = 1;
		$count = 15;
		if (isset($_GET['start'])) $start = $_GET['start'];
		if (isset($_GET['count'])) $count = $_GET['count'];

		if ($start + $count > $max) {
			$count = $max - $start;
		}

		$nstart = $start + $count;
		$pstart = $start - $count;
		$min = 1;
		$next = '<a href="index.php?page=bilder3&start='.$nstart.'&count='.$count.'&album='.$cDir.'">Vis Neste '.$count.'</a>';
		$previus = '<a href="index.php?page=bilder3&start='.$pstart.'&count='.$count.'&album='.$cDir.'">Vis Forrige '.$count.'</a>';

		print ('<a href="index.php?page=bilder">Tilbake til Album</a>');

		$strStart = '<i>Vis Forrige '.$count.'</i>'; 	if ($start > 1) $strStart = $previus;
		$strMid = "Viser bilde $start til og med bilde ".($start+$count - 1)." av totalt $max bilder";
		$strLast =  '<i>Vis Neste '.$count.'</i>'; if (!($start + $count > $max))$strLast = $next;
		?>
		<table width="800" border="0">
		  <tr>
			<td align="left"><?php  print($strStart); ?></td>
			<td align="center"><?php print($strMid); ?></td>
			<td align="right"><?php print($strLast); ?></td>
		  </tr>
		</table>
		<?php
		for ($y = $start; $y <= $start + $count - 1; $y++) {
			print($link[$y]);
			print($img[$y]);
		}		
		?>
		<table width="800" border="0">
		  <tr>
			<td align="left"><?php  print($strStart); ?></td>
			<td align="center"><?php print($strMid); ?></td>
			<td align="right"><?php print($strLast); ?></td>
		  </tr>
		</table>
		<?php	
	} else {
		print('Problemer med og åpne mappen med bilder!');
	}
}else {
	print('Please loginn!!!');
} 


?>

 

 

 

kan det ha noe med minne bruken og gjøre(for lite minne?)

 

Takker for alle svar

 

[EDIT]

I ett annet album hra jeg 100vis av bilder, og det er ikke noe problem og vise alle disse bildene i ett galleri på en gang(dessuten, det er et par bilder der som ikke her 100% opplastet, som generer feilmeldingen: 'premature end jpeg file'(ell), men apache krasjer ikke), det er kun det ene galleriet med 10 bilder og 2 filmer som lager problemer....

Endret av Richard87
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...