2012-02-11 11 views
5

tengo un cronjob que genera captcha para mis formularios en línea (registro, contacto y boletín informativo).imagemagick para captcha

genero más de 5000 imágenes por día, así que cuando muestro el formulario, elijo aleatoriamente uno y luego simplemente muestro la imagen y configuro la sesión.

mi mesa es muy simple:

código de imagen (ID MEDIUMINT (5) PK sin firmar, frase varchar (10));

y luego ejecuto el cronjob que genera las imágenes y las inserto en la base de datos. este proceso tarda un tiempo en ejecutarse y me gustaría saber si hay una mejor manera de hacerlo, para maximizar el rendimiento y la generación, ya que tengo otro cronjob que se ejecuta todo el día y quiero asegurarme de que puedo quitar esto de cronjob entonces mis trabajos cronjob pueden respirar un poco.

+0

¿por qué no usas gd? –

+1

Si tiene en total más de 5000 contactos o boletines, es bastante popular :) Esto parece bastante ineficiente y un desperdicio de recursos. Generar imagen solo cuando sea necesario. – Bakudan

+0

bien, genero 5000 para asegurarme de que cuando realizo la asignación al azar, no obtengo el mismo resultado dos veces. – Owan

Respuesta

8

crear una llamada de archivo Captcha.class.php y poner esto:

class Captcha { 
    private $font = '/path/to/font/yourfont.ttf'; // get any font you like and dont forget to update this. 

    private function generateCode($characters) { 
     $possible = '23456789bcdfghjkmnpqrstvwxyz'; // why not 1 and i, because they look similar and its hard to read sometimes 
     $code = ''; 
     $i = 0; 
     while ($i < $characters) { 
      $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1); 
      $i++; 
     } 
     return $code; 
    } 

    function getImage($width, $height, $characters) { 
     $code = $this->generateCode($characters); 
     $fontSize = $height * 0.75; 
     $image = imagecreate($width, $height); 
     if(!$image) { 
      return FALSE; 
     } 
     $background_color = imagecolorallocate($image, 255, 255, 255); 
     $text_color = imagecolorallocate($image, 66, 42, 32); 
     $noiseColor = imagecolorallocate($image, 150, 150, 150); 
     for($i=0; $i<($width*$height)/3; $i++) { 
      imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noiseColor); 
     } 
     for($i=0; $i<($width*$height)/150; $i++) { 
      imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noiseColor); 
     } 
     $textbox = imagettfbbox($fontSize, 0, $this->font, $code); 
     if(!$textbox) { 
      return FALSE; 
     } 
     $x = ($width - $textbox[4])/2; 
     $y = ($height - $textbox[5])/2; 
     imagettftext($image, $fontSize, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function'); 
     header('Content-Type: image/jpeg'); 
     imagejpeg($image); 
     imagedestroy($image); 
     $_SESSION['captcha'] = $code; 
    } 
} 

Luego, en la página que puede hacer:

<img src="/captcha.php" />

Luego, en el /captcha.php va a poner:

session_start(); 
require('Captcha.class.php'); 
$Captcha = new Captcha(); 
$Captcha->getImage(120,40,6); 

Puede cambiar los parámetros a medida que deseo mostrar un captcha diferente también

De esta forma generará sobre la marcha. Siempre puede guardar la imagen en el disco si así lo desea.

+0

muchas gracias amigo – Owan

+0

de nada –