CI框架教程之优化验证码机制详解【验证码辅助函数】


Posted in PHP onApril 16, 2019

本文实例讲述了CI框架教程之优化验证码机制。分享给大家供大家参考,具体如下:

验证码机制在CI框架中是通过一个辅助函数captcha()进行实现的——验证码辅助函数文件包含了一些帮助你创建验证码图片的函数。。

那么我们如何使用CI的captcha()辅助函数来完成验证码功能呢?下面我会先讲述如何使用CI的captcha()辅助函数来完成验证码功能,然后在讲述如何具体的对CI框架的验证码机制进行优化。

1、CI框架验证码功能的使用

a)  首先我们要先加载辅助函数

加载辅助函数一共有两种方法:

①、自动加载

我们可以在根文件目录下的 “application/config/autoload.php” 文件中进行设置自动加载。

//ci框架设置自动加载辅助函数
//captcha验证码复制函数
$autoload['helper'] = array('url','captcha');

由于我们的项目使用验证码的地方非常有限,故而不推荐使用自动加载这种方法,我们可以在使用到的地方加载使用就可以了。

②、在使用到的地方进行加载

这种方法我们还是比较推荐的,消耗资源较少,效率会稍微的高一点。在你使用到验证码的控制器中写一个构造函数,在构造函数中进行验证码辅助函数加载就可以了。

//构造函数
public function __construct()
{
  //切记在控制器的构造函数中一定先继承父类控制器的构造函数
  parent::__construct();$this->load->helper('captcha');
}

b) 然后使用验证码辅助函数创建验证码

$vals = array(
    'word'     => 'Random word',    //验证码上显示的字符,可以写成函数,例如:rand(100000,999999)
      'img_path'   => './data/captcha/',  //验证码保存路径
      'img_url'    => base_url('data/captcha'),    //验证码图片url
      'font_path'   => './path/to/fonts/texb.ttf',    //验证码上字体
      'img_width'   => '150',    //验证码图片宽度
      'img_height'  => 30,      //验证码图片高度
      'expiration'  => 7200,     //验证码图片删除时间
      'word_length'  => 8,      //验证码长度
      'font_size'   => 16,      //验证码字体大小
      'img_id'    => 'Imageid',
      'pool'     => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
      'colors'    => array(
              'background' => array(255, 255, 255),
            'border' => array(255, 255, 255),
            'text' => array(0, 0, 0),
            'grid' => array(255, 40, 40)
      ),
);

$cap = create_captcha($vals);
var_dump($cap);

这样验证码就创建完成,img_path和img_url这俩个参数必须存在,并且,img_path所表示的路径文件夹必须存在,不然的话创建验证码不会成功。由于每创建一次验证码就会生成一张图片放到你设置的文件夹中,这样是非常消耗资源的,故此我们要对CI框架的验证码功能进行优化。

2、CI框架验证码的优化

优化思路:①、我们不让框架生成的图片进行保存到服务器中;②、我们只保留验证码的的内容即可。

要想对验证码功能进行优化,我们就要对验证码辅助函数功能进行扩展。

a)  扩展验证码辅助函数

首先将根目录下 “system/helpers/captcha_helper.php” 文件复制一份到根目录下 "application/helpers" 目录下,命名为 "MY_captcha_helper.php" ;

然后将下面代码注释掉(大概在96行到119行);

if ($img_path === '' OR $img_url === '' OR ! is_dir($img_path) OR ! is_really_writable($img_path) OR ! extension_loaded('gd'))
{
    return FALSE;
}

// -----------------------------------
// Remove old images
// -----------------------------------

$now = microtime(TRUE);

$current_dir = @opendir($img_path);
while ($filename = @readdir($current_dir))
{
    if (substr($filename, -4) === '.jpg' && (str_replace('.jpg', '', $filename) + $expiration) < $now)
    {
        @unlink($img_path.$filename);
    }
}

@closedir($current_dir);

此段代码防止你没有传递img_path和img_url参数以及参数所指的文件夹不存在就暂停执行函数。

再次注释代码(大概在318行到335行)

$img_url = rtrim($img_url, '/').'/';

if (function_exists('imagejpeg'))
{
    $img_filename = $now.'.jpg';
    imagejpeg($im, $img_path.$img_filename);
}
elseif (function_exists('imagepng'))
{
    $img_filename = $now.'.png';
    imagepng($im, $img_path.$img_filename);
}
else
{
    return FALSE;
}

$img = '<img '.($img_id === '' ? '' : 'id="'.$img_id.'"').' src="'.$img_url.$img_filename.'" style="width: '.$img_width.'; height: '.$img_height .'; border: 0;" alt=" " />';

此段代码用于创建验证码图片,并且将图片保存到你说创建的验证码文件夹中(image_path)。

最后,在create_captcha()函数的最后加上一个header头,最后代码如下:

//直接输出
header("Content-Type:image/jpeg");   //加入图片格式header头
imagejpeg($im);
ImageDestroy($im);
//返回生成的验证码字符串,如果需要其他参数的话也可以加入返回
return $word;
//return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename);

b) 应用扩展优化之后的验证码功能

首先在控制器中写一个生成验证码方法;

然后在方法中进行调用验证码辅助函数,生成验证码;

最后在前台进行调用方法,并实现点击刷新功能。

生成验证码函数代码:

//生成验证码
public function code()
{
    //调用函数生成验证码,上述的参数也可以继续使用
    $vals = array(
        'word_length' => 6,
    );
    create_captcha($vals);
}

前台调用饼实时刷新调用:

<td colspan="2" align="right">
  <img src="<?php echo site_url('admin/privilege/code');?>" alt="" onclick= this.src="<?php echo site_url('admin/privilege/code').'/'?>"+Math.random() style="cursor: pointer;" title="看不清?点击更换另一个验证码。"/>
</td>

至此,CI框架的验证码功能机制优化我们就完成了。

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
PHP防止跨域提交表单
Nov 01 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
php遍历解析xml字符串的方法
May 05 PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 PHP
如何离线执行php任务
Feb 21 PHP
PHP中cookie知识点学习
May 06 PHP
PHP日志LOG类定义与用法示例
Sep 06 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 #PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 #PHP
Laravel框架文件上传功能实现方法示例
Apr 16 #PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 #PHP
PHP获取远程http或ftp文件的md5值的方法
Apr 15 #PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 #PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 #PHP
You might like
php使用pear_smtp发送邮件
2016/04/15 PHP
PHP引用返回用法示例
2016/05/28 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
利用Python破解验证码实例详解
2016/12/08 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
python中解析json格式文件的方法示例
2017/05/03 Python
python文件拆分与重组实例
2018/12/10 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
python实现代码统计程序
2019/09/19 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
为什么python比较流行
2020/06/19 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
升职自荐信范文
2013/10/05 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书