生成验证码类

<?php

/**
 * 验证码类
 * Class VerifyCode
 */
class VerifyCode {
    
    protected $redisObj;
    
    private $charset    = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789'; // 随机因子
    private $codelen    = 4;    // 验证码长度
    private $width      = 85;   // 宽度
    private $height     = 30;   // 高度
    private $fontsize   = 14;   // 指定字体大小
    private $code;  // 验证码
    private $img;   // 图形资源句柄
    private $font;  // 指定的字体
    private $fontcolor; // 指定字体颜色
    
    public function getRedisObj() {
        return $this->redisObj;
    }
    
    protected function setRedisObj($configName='') {
        
        try {
            if ('' === $configName) {
                $obj        = new RedisService();
            }
            else {
                $obj        = new RedisService($configName);
            }
            
            $this->redisObj = $obj->getInstance();
        }
        catch (Exception $e) {
            throw $e;
        }
        
    }
    
    //构造方法初始化
    public function __construct($width=85, $height=30) {
        
        $this->setRedisObj();
        $this->width    = $width;
        $this->height   = $height;
        $this->font     = $_SERVER['DOCUMENT_ROOT'].PUBLIC_PATH.DIRECTORY_SEPARATOR.'file'.DIRECTORY_SEPARATOR.'elephant.ttf';
        
    }
    
    //生成随机码
    private function createCode() {
        
        $_len = strlen($this->charset)-1;
        
        for ($i=0; $i<$this->codelen; $i++) {
            $this->code .= $this->charset[mt_rand(0, $_len)];
        }
        
    }
    
    //生成背景
    private function createBg() {
        
        $this->img  = @imagecreate($this->width, $this->height);
        $color      = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
        imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
        
    }
    
    //生成文字
    private function createFont() {
        
        $_x = $this->width/$this->codelen;
        
        for ($i=0; $i<$this->codelen; $i++) {
            $this->fontcolor = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x*$i+mt_rand(1, 5), $this->height/1.4, $this->fontcolor, $this->font, $this->code[$i]);
        }
        
    }
    
    //生成线条、雪花
    private function createLine() {
        
        for ($i=0; $i<3; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
        }
        
        for ($i=0; $i<50; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
            imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color);
        }
        
    }
    
    //输出
    private function outPut() {
        
        header('Content-type: image/png');
        imagepng($this->img);
        imagedestroy($this->img);
        
    }
    
    //对外生成
    public function doimg() {
        
        $logTitle   = '生成验证码';
        $this->createBg();
        $this->createCode();
        $this->createLine();
        $this->createFont();
        $sessionId  = session_id();
        $verifyCode = $this->getCode();
        $this->redisObj->hSet(SysConst::REDIS_VERIFY_CODE_KEY, $sessionId, $verifyCode);
        $this->redisObj->expire(SysConst::REDIS_VERIFY_CODE_KEY, SysConst::REDIS_EXPIRE_TIME);
        $result     = setcookie(SysConst::VERIFY_CODE_ID, $sessionId, time()+SysConst::REDIS_EXPIRE_TIME, '/');
        $logStr     = __CLASS__.'|'.__FUNCTION__.'|'.__LINE__.'|'.$logTitle.'|redisKey:'.SysConst::REDIS_VERIFY_CODE_KEY.'|key:'.$sessionId.'|verifyCode:'.$verifyCode.'|cookieVerifyCodeId:'.$sessionId.'|setCookieResult:'.((1 == $result) ? 'true' : 'false').'|trace:'.json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), JSON_UNESCAPED_UNICODE);
        Log::write($logStr);
        $this->outPut();
        
    }
    
    //获取验证码
    public function getCode() {
        return strtolower($this->code);
    }
    
}
原文地址:https://www.cnblogs.com/wjs2019/p/14788756.html