Webwolf: Captcha-Erzeugung friert ein nach x Anfragen

Beitrag lesen

Hallo.

Ich bin schon lange auf der Suche nach einer Lösung. Websuchen ergaben leider keine entsprechende Hilfe. Deshalb auch mein Beitrag. :)

Es geht hierbei NICHT um die eigentliche Implementierung eines Captchas sondern vielmehr um die Anzeige bzw. des Neuladens des Bildes im Browser.

Beobachtung (Problemstellung):
Nach einem Neustart des Webservers (Apache 2.4.4) funktioniert die Anzeige und das Neuladen des Bildes wie gewünscht normal. Doch nachdem einige (~20) Captchas generiert worden sind (also nach x Anfragen von versch. Captchas) wiederholen sich die zuletzt generierten ~2-4 Captchas in zufälliger Reihenfolge und es kommen keine neuen mehr. Manchmal wird and Ende sogar nur noch ein Bild angezeigt (Cachelöschen oder Neustarten des Browsers helfen hier nicht).
Wartet man allerdings einige Zeit ab oder startet man den Webserver neu, kommen wieder neu generierte Bilder (Webserver hat Speicher/Cache geleert??). Das o.g. Szenario tritt wiederholt ein. Der in der Session gespeicherte String(=$captcha) wird immer korrekt im Bild angezeigt.

Ob der Fehler beim Webserver oder beim Browser zu suchen ist, kann ich leider nicht sagen. Da sich allerdings Session und Bild immer einig sind und ein Webserver-Neustart hilft, vermute ich, dass der Fehler bei mir (also beim Server/Apache/PHP?) zu suchen ist. Den JS Code habe ich dennoch angefügt.

Ich würde zunächst gerne wissen, was hier genau dieses Verhalten verursacht und ob man das überhaupt in den Griff bekommt. Wie man letztendlich dieses "Problem" beseitigen kann, versuche ich, nachdem ich die Ursache begriffen habe.

Ich hoffe, dass mir jemand bei dieser Sache helfen kann und die von mir angegebenen Codeauszüge für eine Analyse reichen. Danke! :)

  
;php.ini  
max_execution_time=30  
max_input_time=60  
memory_limit=128M  

  
// captcha.php (8.09 KB)  
$fonts = array(  
	'font1.ttf',	// Filesize: 48.9 KB  
	'font2.ttf',	// Filesize: 45.0 KB  
	'font3.otf',	// Filesize: 303 KB  
	'font4.ttf',	// Filesize: 122 KB  
	'font5.ttf',	// Filesize: 101 KB  
	'font6.ttf'	// Filesize: 54.8 KB  
			// ------------------  
			//	674.7 KB  
	);  
// .....  
$img = imagecreatetruecolor($img_width, $img_height);  
// .....  
for($i=0;$i<$captcha_lenght;$i++) {  
	// .....  
	$font = $font_path.$fonts[rand(0, count($fonts) - 1)];  
	// .....  
}  
// .....  
$_SESSION['captcha'] = $captcha;  
header("Expires: Tue, 01 Jan 2013 00:00:00 GMT");  
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  
header("Cache-Control: no-store, no-cache, must-revalidate");  
header("Cache-Control: post-check=0, pre-check=0", false);  
header("Cache-directive: no-cache");  
header("Pragma: no-cache");  
header('Content-type: image/png',true);  
imagepng($img);  
imagedestroy($img); // free from memory  

  
// script.js  
this.get_new_captcha = function (callback) {  
	var $captcha = $('img#captcha');  
	var $container = $captcha.parent();  
	// Show loading  
	$captcha.hide();  
	$container.html('loading...');  
	var img = new Image();  
	// Get Stock image src  
	img.stock_src = $captcha.attr('src').split('?')[0]; // captcha.php  
	// Get new src  
	img.src = img.stock_src + '?rand=' +(new Date()).getTime();  
	// replace captcha  
	img.onload = function() {  
		$captcha.remove();  
		img.id = 'captcha';  
		$container.html(img);  
	}  
}