php仿QQ验证码的实例分析


Posted in PHP onJuly 01, 2013

有需要的朋友,参考下吧。

<?php
/**
 * 仿QQ验证码
*/
//Session保存路径
$sessSavePath = dirname(__FILE__)."/../data/sessions/";
if(is_writeable($sessSavePath) && is_readable($sessSavePath)){ session_save_path($sessSavePath); }
session_start();
//获取随机字符
$rndstring = '';
for($i=0; $i<4; $i++) $rndstring .= chr(mt_rand(65,90));
$img_height=45;    //先定义图片的长、宽
$img_width=10;
//如果支持GD,则绘图
if(function_exists("imagecreate"))
{
 //Firefox部份情况会多次请求的问题,5秒内刷新页面将不改变session
 $ntime = time();
 if(empty($_SESSION['dd_ckstr_last']) || empty($_SESSION['dd_ckstr']) || ($ntime - $_SESSION['dd_ckstr_last'] > 5))
 {
  $_SESSION['dd_ckstr'] = strtolower($rndstring);
  $_SESSION['dd_ckstr_last'] = $ntime;
 }
 $rndstring = $_SESSION['dd_ckstr'];
 $rndcodelen = strlen($rndstring);
 //创建图片,并设置背景色
 $im = imagecreate(46,20);
 ImageColorAllocate($im, 240,243,248);
 //干扰线
 $lineColor1 = ImageColorAllocate($im, mt_rand(174,218),mt_rand(190,225),mt_rand(217,237));
 for($j=1;$j<=2;$j=$j+3)
 {
  imageline($im,0,$j+mt_rand(1,15),48,$j+mt_rand(1,15),$lineColor1);
 }
 //输出文字
 $fontColor = ImageColorAllocate($im, mt_rand(0,150),mt_rand(0,150),mt_rand(0,150));
 for($i=0;$i<$rndcodelen;$i++)
 {
  $bc = mt_rand(0,1);
  $rndstring[$i] = strtoupper($rndstring[$i]);
  imagestring($im,mt_rand(3,5),$i*$img_height/4+mt_rand(1,5),mt_rand(1,$img_width/2), $rndstring[$i], $fontColor);
 }
 header("Pragma:no-cache"r"n");
 header("Cache-Control:no-cache"r"n");
 header("Expires:0"r"n");
 //输出特定类型的图片格式,优先级为 gif -> jpg ->png
 if(function_exists("imagepng"))
 {
  header("content-type:image/png"r"n");
  imagepng($im);
 }
 else
 {
  header("content-type:image/jpeg"r"n");
  imagejpeg($im);
 }
 ImageDestroy($im);
 exit();
}
else
{
 //不支持GD,只输出字母 ABCD
 $_SESSION['dd_ckstr'] = "abcd";
 $_SESSION['dd_ckstr_last'] = ''; 
 header("content-type:image/png"r"n");
 header("Pragma:no-cache"r"n");
 header("Cache-Control:no-cache"r"n");
 header("Expires:0"r"n");
 $fp = fopen("data/vdcode.jpg","r");
 echo fread($fp,filesize("data/vdcode.jpg"));
 fclose($fp);
 exit();
}
?>

PHP 相关文章推荐
人大复印资料处理程序_查询篇
Oct 09 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
PHP获取类中常量,属性,及方法列表的方法
Apr 09 PHP
PHP sprintf()函数用例解析
May 18 PHP
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
Jun 10 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
php图像处理类实例
Jul 28 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
PHP实现批量删除(封装)
Apr 28 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
计算php页面运行时间的函数介绍
Jul 01 #PHP
php 地区分类排序算法
Jul 01 #PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 #PHP
php 常用算法和时间复杂度
Jul 01 #PHP
关于php循环跳出的问题
Jul 01 #PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 #PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 #PHP
You might like
ThinkPHP控制器详解
2015/07/27 PHP
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
jQuery异步提交表单的两种方式
2016/09/13 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
python文件写入实例分析
2015/04/08 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python修改MP3文件的方法
2015/06/15 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
基于python的Paxos算法实现
2019/07/03 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
上课迟到检讨书100字
2014/01/11 职场文书
校园之星获奖感言
2014/01/29 职场文书
企业年会主持词
2014/03/27 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
教师师德师风整改措施
2014/10/24 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
springboot入门 之profile设置方式
2022/04/04 Java/Android