php 生成图片验证码 laravel

2018-03-01 11:12:46来源:oschina作者:请叫我足下人点击

分享
环境:
"php": ">=5.5.9"
"laravel/lumen-framework": "5.2.*",我使用的是laravel框架,其他php框架也一样
使用方法:

1.使用composer获取验证码库


php composer.phar require lifei6671/php-captcha

2.具体使用


<?php
use Minho/Captcha/CaptchaBuilder;
$captch = new CaptchaBuilder();
$captch->initialize([
'width' => 150, // 宽度
'height' => 50, // 高度
'line' => false,// 直线
'curve' => true,// 曲线
'noise' => 1,// 噪点背景
'fonts' => []// 字体
]);
$captch->create();
//直接输出图片:
$captch->output(1);
//保存图片到硬盘:
$captch->save('1.png',1);
//获取验证码文字并存储到session中:
$_SESSION['captch'] = $captch->getText();
示例:

该示例是基于上面的环境



获取验证码和校验验证码的类CaptchaMake<?php
/**
* Created by PhpStorm.
* User: zero
* Date: 2018/2/26
* Time: 16:40
*/
namespace App/Libs;
use Illuminate/Http/Request;
use Minho/Captcha/CaptchaBuilder;
use Exception;
use Log;
class CaptchaMake
{
/**
* 获取验证码
* @return string
*/
public static function getCaptcha()
{
try{
$captch = new CaptchaBuilder();
$captch->initialize([
'width' => 150, // 宽度
'height' => 50, // 高度
'line' => false,// 直线
'curve' => true,// 曲线
'noise' => 2,// 噪点背景
'fonts' => []// 字体
]);
$captch->create();
new SessionManager();
$_SESSION['captch'] = $captch->getText();
//生成并返回图片流base64编码
ob_start ();
$captch->output(1);
$image_data = ob_get_contents ();
ob_end_clean ();
$image_data_base64 = base64_encode ($image_data);
return $image_data_base64;
} catch (Exception $e) {
Log::emergency('获取图片验证码报错: ', [$e->getMessage()]);
Log::error($e->getFile() . ":" . $e->getLine());
}}
/**
* 校验验证码
* @param Request $request
* @return array
*/
public static function checkCaptcha(Request $request)
{
try{
$code=$request->input('code',false);
if($code===false){
return ReturnCode::create(-1, [], '请填写图片验证码');
}
if(!isset($_SESSION['captch'])){
return ReturnCode::create(-1, [], '图片验证码已过期,请重新获取');
}
if($code!=$_SESSION['captch']){
return ReturnCode::create(-1, [], '图片验证码错误');
}
return ReturnCode::create(ReturnCode::SUCCESS);
} catch (Exception $e) {
Log::emergency('校验图片验证码报错: ', [$e->getMessage()]);
Log::error($e->getFile() . ":" . $e->getLine());
}}
}将验证码存储到基于redis的session中的类SessionManager<?php
/**
* Created by PhpStorm.
* User: zero
* Date: 2018/2/27
* Time: 15:44
*/
namespace App/Libs;
use Log;
class SessionManager
{
private $redis;
private $sessionSavePath;
private $sessionName;
public function __construct(){
$this->redis = app('redis');
$this->sessionExpireTime = 30;
$retval = session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destroy"),
array($this,"gc")
);
session_start();
}
//会话开始时,会执行该方法,连接redis服务器
public function open($path,$name){
return true;
}
//会话结束时,调用该方法,关闭redis连接
public function close(){
return true;
}
// 在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。
public function read($id){
//Log::info('===============session=======read====$id===='.$id);
//Log::info('===============session=====expire=$id===='. $this->redis->ttl($id));
$value = $this->redis->get($id);//获取redis中的指定记录
if($value){
return $value;
}else{
return '';
}
}
// 会话保存数据时调用该方法,在脚本执行完或session_write_close方法调用之后调用
public function write($id,$data){
//Log::info('===============session====write=======$id===='.$id);
//Log::info('===============session====write=======$data===='.$data);
if($this->redis->set($id,$data)){//以session ID为键,存储
$this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
return true;
}
return false;
}
// 清除会话中的数据,当调用session_destroy()函数,或者调用 session_regenerate_id()函数并且设置 destroy 参数为 TRUE 时,会调用此回调函数。
public function destroy($id){
if($this->redis->delete($id)){//删除redis中的指定记录
return true;
}
return false;
}
public function gc($maxlifetime){
return true;
}
public function __destruct(){
session_write_close();
}
//设置过期时间
public function setSessionExpireTime($time){
$this->sessionExpireTime = $time;
}
}

该示例,需要基本熟悉laravel框架,如有不懂,可以在评论区提问,我会尽力解答


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台