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 相关文章推荐
解决控件遮挡问题:关于有窗口元素和无窗口元素
Jan 28 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
php二维码生成
Oct 19 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 PHP
PHP实现通过文本文件统计页面访问量功能示例
Feb 13 PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
django数据模型on_delete, db_constraint的使用详解
2019/12/24 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
机关作风建设工作总结
2014/10/23 职场文书
中小学生学籍证明
2014/10/25 职场文书
鲁迅故里导游词
2015/02/05 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python