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 相关文章推荐
Mysql的常用命令
Oct 09 PHP
4.与数据库的连接
Oct 09 PHP
php htmlspecialchars加强版
Feb 16 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
解决php表单重复提交实现方法
Sep 29 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 PHP
PHP中array_keys和array_unique函数源码的分析
Feb 26 PHP
PHP 中提示undefined index如何解决(多种方法)
Mar 16 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
Mar 29 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 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
php+mysql 实现身份验证代码
2010/03/24 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
PHP连接SQLServer2005的方法
2015/01/27 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
Javascript 解疑
2009/11/11 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
js有序数组的连接问题
2013/10/01 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
Python实现截屏的函数
2015/07/25 Python
Python面向对象特殊成员
2017/04/24 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python中print函数简单使用总结
2019/08/05 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python中for in的用法详解
2020/04/17 Python
python进度条显示之tqmd模块
2020/08/22 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
2014升学宴答谢词
2014/01/26 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
敬老院活动感想
2015/08/07 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL