PHP实现随机数字、字母的验证码功能


Posted in PHP onAugust 01, 2018

可自定义生成验证码文字的大小、数量、干扰项等等,也可以自定义验证文字的字体。。。

废话不多说,直接上代码:

1、classgd.class.php

<?php
Class Captcha{
    private $_fontfile='';
    private $_size=36;
    private $_width=200;
    private $_height=100;
    private $_length=4;
    private $_image=null;
    private $_snow=0;
    private $_pixel=0;
    private $_line=0;
  public function __construct($config=array()){
    if(is_array($config)&&count($config)>0){
      if(isset($config['fontfile'])&&is_file($config['fontfile'])&&is_readable($config['fontfile'])){
        $this->_fontfile=$config['fontfile'];
      }else{
        return false;
      }
      if(isset($config['size'])&&$config['size']>0){
        $this->_size=(int)$config['size'];
      }
      if(isset($config['width'])&&$config['width']>0){
        $this->_width=(int)$config['width'];
      }
      if(isset($config['height'])&&$config['height']>0){
        $this->_height=(int)$config['height'];
      }
      if(isset($config['length'])&&$config['length']>0){
        $this->_length=(int)$config['length'];
      }
      if(isset($config['snow'])&&$config['snow']>0){
        $this->_snow=(int)$config['snow'];
      }
      if(isset($config['pixel'])&&$config['pixel']>0){
        $this->_pixel=(int)$config['pixel'];
      }
      if(isset($config['line'])&&$config['line']>0){
        $this->_line=(int)$config['line'];
      }
      $this->_image=imagecreatetruecolor($this->_width,$this->_height);
      return $this->_image;
     }
     else{
      return false;
    }
  }
  public function getCaptcha(){
    $white=imagecolorallocate($this->_image,255,255,255);
    imagefilledrectangle($this->_image,0,0,$this->_width,$this->_height,$white);
    $str=$this->_generateStr($this->_length);
    if(false===$str){
      return false;
    }
    $fontfile=$this->_fontfile;
    for($i=0;$i<$this->_length;$i++){
      $size=$this->_size;
      $angle=mt_rand(-30,30);
      $x=ceil($this->_width/$this->_length)*$i+mt_rand(5,10);
      $y=ceil($this->_height/1.5);
      $color=$this->_getRandColor();
      //针对中文字符截取
      //$text=mb_substr($str,$i,1,'utf-8');
      $text=$str{$i};
      imagettftext($this->_image, $size, $angle, $x, $y, $color, $fontfile, $text);
    }
    if($this->_snow){
      $this->_getSnow();
    }else{
      if($this->_pixel){
        $this->_getPixel();
      }
      if($this->_line){
        $this->_getLine();
      }
    }
    header('content-type:image/png');
    imagepng($this->_image);
    imagedestroy($this->_image);
    return strtolower($str);
  }
  private function _getSnow(){
    for($i=1;$i<=$this->_snow;$i++){
      imagestring($this->_image,mt_rand(1,5),mt_rand(0,$this->_width),mt_rand(0,$this->_height),'*',$this->_getRandColor());
    }
  }
  private function _getPixel(){
    for($i=1;$i<=$this->_pixel;$i++){
      imagesetpixel($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),$this->_getRandColor());
    }
  }
  private function _getLine(){
    for($i=1;$i<=$this->_line;$i++){
      imageline($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),mt_rand(0,$this->_width),mt_rand(0,$this->_height),$this->_getRandColor());
    }
  }
  private function _generateStr($length=4){
    if($length<1 || $length>30){
      return false;
    }
    $chars=array(
      'a','b','c','d','e','f','g','h','k','m','n','p','x','y','z',
      'A','B','C','D','E','F','G','H','K','M','N','P','X','Y','Z',
      1,2,3,4,5,6,7,8,9
      );
    $str=join('',array_rand(array_flip($chars),$length));
    return $str;
  }
  private function _getRandColor(){
    return imagecolorallocate($this->_image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  }
}
?>

 2、testCaptcha.php

<?php
require_once 'classgd.class.php';
$config=array(
'fontfile'=>'fonts/simfang.ttf',  //引入字体文件
//'snow'=>50,
'pixel'=>100,
'line'=>10
  );
$captcha=new Captcha($config);
$captcha->getCaptcha();
?>

总结

以上所述是小编给大家介绍的PHP实现随机数字、字母的验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP脚本的10个技巧(8)
Oct 09 PHP
WIN98下Apache1.3.14+PHP4.0.4的安装
Oct 09 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
ThinkPHP连接数据库的方式汇总
Dec 05 PHP
深入浅出php socket编程
May 13 PHP
thinkPHP中验证码的简单使用方法
Dec 26 PHP
orm获取关联表里的属性值
Apr 17 PHP
Yii中CGridView禁止列排序的设置方法
Jul 12 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 #PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 #PHP
PHP常用日期加减计算方法实例小结
Jul 31 #PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 #PHP
PHP笛卡尔积实现算法示例
Jul 30 #PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 #PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 #PHP
You might like
php程序效率优化的一些策略小结
2010/07/17 PHP
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
详解javascript高级定时器
2015/12/31 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
Python 字符串与数字输出方法
2018/07/16 Python
python实现石头剪刀布小游戏
2021/01/20 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
开学典礼策划方案
2014/05/28 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
房产公证书格式
2015/01/26 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android