2012-02-11 32 views
5

tôi có một cronjob tạo captcha cho các biểu mẫu trực tuyến của tôi (đăng ký, liên hệ và bản tin).imagemagick cho captcha

tôi tạo hơn 5000 hình ảnh mỗi ngày để khi tôi hiển thị biểu mẫu, tôi chọn ngẫu nhiên một biểu mẫu và sau đó chỉ cần hiển thị hình ảnh và đặt phiên.

bảng của tôi rất đơn giản:

captcha (id mediumint (5) unsigned PK, cụm từ varchar (10));

và sau đó tôi chạy cronjob tạo hình ảnh và chèn vào DB. quá trình này mất một thời gian để chạy và tôi muốn biết nếu có cách nào tốt hơn để làm điều này, để tối đa hóa hiệu suất và thế hệ kể từ khi tôi có cronjob khác chạy cả ngày và tôi muốn chắc chắn rằng tôi có thể lấy điều này từ cronjob vì vậy công việc cronjob của tôi có thể hơi thở một chút.

+0

tại sao bạn không sử dụng gd? –

+1

Nếu bạn có tổng cộng hơn 5000 liên lạc hoặc bản tin, bạn khá phổ biến :) Điều này có vẻ khá kém hiệu quả và lãng phí tài nguyên. Chỉ tạo hình ảnh khi cần. – Bakudan

+0

tôi cũng tạo ra 5000 để đảm bảo khi tôi ngẫu nhiên tôi không nhận được cùng một hai lần. – Owan

Trả lời

8

Tạo một cuộc gọi tập tin Captcha.class.php và đặt này:

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; 
    } 
} 

Sau đó, trong trang của bạn, bạn có thể làm:

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

Sau đó, trong /captcha.php bạn sẽ đặt:

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

Bạn có thể thay đổi các thông số như bạn cũng muốn hiển thị hình ảnh xác thực khác.

Bằng cách này, bạn sẽ tạo ra khi đang di chuyển. Bạn luôn có thể lưu hình ảnh trên đĩa nếu bạn muốn.

+0

cảm ơn rất nhiều bạn đời – Owan

+0

bạn được chào đón –

Các vấn đề liên quan