我使用的是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());
}
}
}
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框架,如有不懂,可以在评论区提问,我会尽力解答
Original url: Access
Created at: 2018-10-10 17:19:16
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论