SESSION:
原理:
session与浏览器无关,但是与cookie有关
1.PHP碰到session_start()时开启session会话,会自动检测sessionID
a. 如果cookie中存在,使用现成的
b. 如果cookie中不存在,创建一个sessionID,并通过响应头以cookie形式保存到浏览器上
2.初始化超全局变量$_SESSION为一个空数组
3.PHP通过sessionID去指定位置(session文件存储位置)匹配对应的文件
a.不存在该文件:创建一个session命名文件;
b.存在该文件:读取文件内容(反序列化),将数据存储到 $_SESSION中。
4.脚本执行结束,将$_SESSION中保存的所有数据序列化存储到session对应的文件中
具体流程:
SESSION基本使用:
启用数据:
启用session,任何时候都需要开启session(脚本使用到$_SESSION就开启一次);
$_SESSION时通过session_start()函数的调用才会定义的,没有直接定义
删除数据:
删除session就是用session数据清理掉($_SESSION拿不到)
设置SESSION信息:
如果想存储数据到session中,那么只要不断给$_SESSION数据添加元素即可
删除SESSION信息:
基本语法:Unset($_SESSION[元素下标])删除指定session数据
删除全部数据,就是让$_SESSION变成一个空数组
销毁SESSION信息:
Session删除是指别除session数据,$_SESSION中看不到了而已,销毁session是指删除session对应的session文件。
系统提供一个函数:session_destroy(),会自动根据session_stary得到的sessionID去找到指定的session文件,并把其删除
读取SESSION信息:
$_SESSION就是一个数组,存储什么数据,什么方式存的,就是可以通过什么方式访问什么数据
会话技术的本质就是为了实现跨脚本共享数据:在一个脚本中定义数据,在另一个脚本中保存数据
其中sessionid的值是随机生成的
SESSION基础配置:
- session.name:session名字, 保存到COOKIE中sessionID对应的名字
- session.auto_start:是否自动开启session(无需手动session_start()),默认是关闭的
- session.save_handler:session数据的保存方式,默认是文件形式
- session.save_path:session文件默认存储的位置
使用系统的文件夹存储不安全,需要指定对应存储路径
SESSION常用配置:
- session.cookie_lifetime:PHPsessionID在浏览器端对应COOKIE的生命周期,默认是会话结束
- session.cookie_path:sessionID在浏览器存储之后允许服务器访问的路径(COOKIE有作用范围)
-
- session.cookie_domain:
配置的两种形式:
- php.ini中配置:全局配置, 修改php.ini中的配置项
- 脚本中配置:PHP可以通过ini_set函数来在运行中设定某些配置项(只会对当前运行的脚本有效),把这种配置称之为项目级
@ini_set('session.save_path','E:/server/session');
SESSION垃圾回收机制:
session会话技术后,session文件并不会自动清除,如果每天有大量session文件产生但是又都是失效的,会增加服务器的压力和影响session效率。垃圾回收,是指session机制提供了一种解决垃圾session文件的方式:给session文件指定周期,通过session文件最后更改时间与生命周期进行结合判定,如果已经过期则删除对 应的sessior文件,如果没有过期测保留这样就可以及时清理无效的僵尸文件,从而提升空间利用率和session工作效率。
- 任何一次session开启,session都会尝试去读取session文件
- 读取session文件后,有可能触发垃圾回收机制(在session系统中也是一个函数,自己有几率调用)
- 垃圾回收机,制会自动读取所有session文件的最后编辑时间,然后加上生命周期(配置文件)与当前时间进行比较(所有session文件)
a.过期:删除
b.有效:保留
垃圾回收参数:
1.session.gc_maxlifetime = 1440:
规定的session文件最大的生命周期是1440秒,24分钟
2.session.fc_probability = 1:
垃圾回收概率因子(分子)
3.session.fc_divisor = 1000:
垃圾回收概率因子(分母)
默认的触发概率是1/1000
垃圾回收测试效果:
1.修改生命周期为2分钟,120秒
2.修改触发几率:100%
要重启Apache服务器
禁用 COOKIE后如何使用SESSION:
禁用 COOKIE后不能使用SESSION的原因:
session技术需要利用到COOKIE技术来保存sessionID,从而使得PHP能够跨脚本的时候得到相同的sessionID,从而访问同一个session文件
解决思路:最终让session_start在开启之前拿到原来的sessionID(另外一个脚本的)
实现无COOKIE使用SESSION:
1.可以利用PHP提供的sesion函数:session_id和session_name来获得和设置sessionID或者name从而解决session_start产生新sessionID的情况(手动操作);:
- 在session保存数据的脚本中获取sessionID和名字
- 想办法将数据传递给另外一个脚本:表单传值(URL或者from表单)
- 在需要使用到session的脚本中,先接受数据:
- 组织session_start产生新的ID,告诉它已经存在:session_id($id);
2.可以利用session集中已经提供的解决方案自动操作(配置):
GD图像处理:
创建画布资源:
注:如果从已知文件创建图片资源,那么打开一定要匹配对应的打开方式,负责会出错
- imgecrete(宽,高):创建一个空白画布(背景色是白色的)
- imagcreatetruecolor(宽,高):创建一个真彩画布(背景色是黑色的,需要填充)
- imagecreatefromjpeg(图片文件路径):打开一个jpeg格式的图片资源
- imagecreatefromgif(图片文件路径):打开一个gif格式图片资源
- imagecreatefrompng(图片文件路径):打开一个png格式图片资源
操作画布资源:
1.分配颜色:imagecolorallocate(画布资源,红色,绿色,蓝色,)
根据RGB三色组给指定画布资源分配一组颜色,会返回一个颜色句柄(一组整数),每一个色组都是从0到255
在真彩图片资源中,所有分配的颜色都不会自动给图片资源上色,是用来后续操作图片资源的时候,指定着色的:但是如果当前使用的magecreate创建的图片资源,那么第一个分配的颜色,会自动被着色为图片背景色。
注:凡是给图片上增加内容,基本都需要分配颜色(每一个操作图片的函数之前,都需要先调用分配颜色的函数得到一个颜色)
2.填充区域:imagefill(画布资源,起始x坐标,起始y坐标,颜色句柄):
指定位置,开始填充
填充逻辑:从指定点开始,自动匹配相邻点,如果颜色一致,自动渲染,扩展到全图。
3.画直线:imageline(图片资源,起始点x,起始点y,终点x,终点y,颜色):
画一条直线
4.画矩形:imagerectangle(图片资源,左上角x,左上角y,右下角x,右下角y,颜色):
制作一个矩形
5.画圆弧:imagearc(图像资源,轴点x,轴点y,宽度,高度,弧度起点,弧度终点,颜色):
制作弧度图像
6.在画布上写字:
imagestring(图片资源,文字大小,起始x,起始y,内容,颜色):
用来书写ASCII对应的字符(英文)
书写任意文字,返回一个数组
imagettrtext(图片资源,文字大小,旋转角度,起始x,起始y,颜色,字体,内容):
书写任意文字,需要指定字体路径(ttf文件,默认在windows/fonts/)
位置:
结果:
注:所有的画布资源操作都需要指定画布资源,而且都是第一个参数
输出和销毁画布资源:
输出画布资源:
输出为图片文件:以图片文件形式保存到本地文件夹;
输出为网页图片:将图片展示给HTML(用户)
imagejpeg():保存为jpeg格式图片
imagepng():保存为png格式图片
imagegif():保存为gif格式图片
如果图片只是提供了图片资源,不指定保存的图片位置,那么系统认为是输出给浏览器;如果指定了位置,那么系统会认为保存到本地(第二个参数)
代码:
<?php//创建一个真彩照片$img = imagecreatetruecolor(100, 100) or die('图片初始化失败');//var_dump($img);//从以后jepeg图片中打开资源//分配颜色$bg_color = imagecolorallocate($img,250,0,0);//填充背景色imagefill($img,0,0,$bg_color);//制作直线$line_color = imagecolorallocate($img,0,255,0);imageline($img,10,10,90,90,$line_color);//制作矩形$rec_color =imagecolorallocate($img,0,255,0);imagerectangle($img,10,10,90,90,$rec_color);//制作一个圆弧(圆)$arc_color = imagecolorallocate($img,0,0,0);imagearc($img,50,50,80,80,180,360,$arc_color);//写入英文字符串$str_color = imagecolorallocate($img,100,100,100);imagestring($img,5,20,20,'sb SB',$str_color);//写入中文$ch_color = imagecolorallocate($img,50,50,50);imagettftext($img,30,45,50,50,$ch_color,'C:/Windows/Fonts/simsun.ttc','中国人民万岁');//保存输出 imagepng($img,'my.png'); //通常png比较多(自己创建的画布),如果是打开文件保存成原来类型imagepng($img);?>
网页:
告知服务器为图片后:
注:如果图片输出或者保存出错,浏览器看到的永远是告诉你图片错了,但是绝对不会告
知错误原因在哪
解决:关闭header,看报错位置
一般php8不会出现类型情况,会直接报错
特殊情况:
如果php代码有空格或者空行,那么服务器会自动当成HTML直接输出,导致错误
这种错误可通过查看网页来查找:
销毁画布资源:
imagedestroy(创建图片的变量)
获取图片信息:
1.获取画布尺寸:
imagesx():
imagesy():
2.获取图片尺寸
getimagesize():
验证码处理:
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机,和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
但目前AI已经可以识别验证码
实现验证码图片的展示:
a.生成图片资源:背景色设定
b.写入文字
c.输出图片给浏览器
d.关闭资源
<?php//开启资源$img = imagecreatetruecolor(520,50);//背景色$de_color = imagecolorallocate($img,220,230,210);imagefill($img,0,0,$de_color);//写入内容$font = __DIR__ . '/STHUPO.TTF';$str_color = imagecolorallocate($img,100,100,100);imagettftext( $img, 30,15, 60, 40, $str_color,$font,'中国');imagettftext( $img,30, -15,140, 40, $str_color,$font,'中');//输出资源header('Content-type:image/png');imagepng($img);//关闭资源imagedestroy($img);?>
实现验证码文字颜色的随机变化:
有一串文字可以随机选择
a.制作目标字符串集:从哪里选内容
b.如何随机从字符串中取出对应的汉字:汉字在utf-8字符集中一个字占用3个字节,英文字母只占一个字节
//开启资源$img = imagecreatetruecolor(520,50);//背景色$de_color = imagecolorallocate($img,220,230,210);imagefill($img,0,0,$de_color);//获得随机文字$str = '我家住在黄土高坡大风从坡上刮过无论是东南风还是西北风都是我的歌';//获取字符串长度$len = strlen($str);$c_len = $len / 3;//随机取一个$char = substr($str,mt_rand(0,$c_len - 1) * 3,12);echo $char;
补1:
substr(
string $string, // 要处理的原始字符串
int $offset, // 起始位置(关键参数)
?int $length = null // 可选,截取长度 ):
string|false
参数说明 $string:必填,要操作的原始字符串。 $offset:必填,决定从哪里开始截取: 为正数:从字符串的第 $offset 个字符开始(字符串索引从 0 起算,比如 substr("abcde", 2) ,从第 3 个字符 'c' 开始 )。 为负数:从字符串末尾倒数第 abs($offset) 个字符开始(如 substr("abcde", -2) ,从倒数第 2 个字符 'd' 开始 )。 为 0:从字符串开头第 1 个字符开始。 $length:选填,截取的字符长度: 为正数:截取 $length 个字符(若剩余字符不足,取到末尾 )。 为负数:截取到距离字符串末尾 abs($length) 个字符的位置(如 substr("abcde", 1, -1) ,从索引 1 开始,到倒数第 1 个字符前结束,结果是 'bcd' )。 不填 / 为 null:截取从 $offset 开始到字符串末尾的所有字符。
补2:
my_rand(起始位置,终点位置):
从起始位置到终点位置,随机挑选一个数并返回
c.随机取出相应的字符(中文汉字)
$char = substr($str,mt_rand(0,$c_len - 1) * 3,3);
d.将取出的字符放到指定的图片位置即可
imagettftext( $img, 30,15, 60, 40, $str_color,$font,$char1);imagettftext( $img,30, -15,140, 40, $str_color,$font,$char2);
整体效果展示:
实现验证码文字颜色的随机变化:
每次产生不同颜色的文字
$font = __DIR__ . '/STHUPO.TTF';$str_color1 = imagecolorallocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));$str_color2 = imagecolorallocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));imagettftext( $img, 30,15, 60, 40, $str_color1,$font,$char1);imagettftext( $img,30, -15,140, 40, $str_color2,$font,$char2);
预览:
实现验证码背景或干扰噪点:
增加一些额外的不影响用户看但是会产生模糊效果的内容(点或者直线):imagestring/imageline/
干扰线:
//增加干扰for($i = 0;$i < 50 ;$i++){//点:写字符$dots_color = imagecolorallocate($img, mt_rand(150,250),mt_rand(150,250),mt_rand(150,250));imagestring($img, mt_rand(1,5),mt_rand(0,200),mt_rand(0,50),'*',$dots_color);}for($i = 0;$i < 20 ;$i++){//线:画直线$line_color = imagecolorallocate($img, mt_rand(150,250),mt_rand(150,250),mt_rand(150,250));imageline($img, mt_rand(0,200),mt_rand(0,50),mt_rand(0,200),mt_rand(0,50),$line_color);}
c.大小和位置改变:
<?php//开启资源$img = imagecreatetruecolor(520,50);//背景色$de_color = imagecolorallocate($img,220,230,210);imagefill($img,0,0,$de_color);//获得随机文字$str = '我家住在黄土高坡大风从坡上刮过无论是东南风还是西北风都是我的歌';for($i = 0;$i < 20 ;$i++){//线:画直线$line_color = imagecolorallocate($img, mt_rand(150,250),mt_rand(150,250),mt_rand(150,250));imageline($img, mt_rand(0,200),mt_rand(0,50),mt_rand(0,200),mt_rand(0,50),$line_color);}//获取字符串长度$len = strlen($str);$c_len = $len / 3;//随机取一个$char1 = substr($str,mt_rand(0,$c_len - 1) * 3,3);$char2 = substr($str,mt_rand(0,$c_len - 1) * 3,3);//写入内容$font = __DIR__ . '/STHUPO.TTF';$str_color1 = imagecolorallocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));$str_color2 = imagecolorallocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));imagettftext( $img, mt_rand(10,25),mt_rand(-15,25), mt_rand(30,40), 40, $str_color1,$font,$char1);imagettftext( $img,mt_rand(10,25), -mt_rand(-15,25),140, mt_rand(-30,40), $str_color2,$font,$char2);//增加干扰for($i = 0;$i < 50 ;$i++){//点:写字符$dots_color = imagecolorallocate($img, mt_rand(150,250),mt_rand(150,250),mt_rand(150,250));imagestring($img, mt_rand(1,5),mt_rand(0,200),mt_rand(0,50),'*',$dots_color);}//输出资源header('Content-type:image/png');imagepng($img);//关闭资源imagedestroy($img);?>
实现点击刷新验证码功能:
用js实现
缩略图实现:
缩略图原理:将原图打开,然后放到另外一个较小的图片资源中,最后进行保存即可;
2.实现固定宽高的缩略图
a.得到一个原图资源(较小)
b.得到一个缩略图资源
c.图片采样复制:GD提供一个函数
imagecopyresampled(缩略图资源,原图资源,缩略图需要放的x位置,缩略图需要放的y位置,原图采样起始x,原图采样起始y,缩放图存放宽,缩略图存放高,原图采样宽,原图采样高):
补:imagesx():取得图像宽度
d.保存缩略图
e.销毁所有资源(原图和缩略图)
3.实现等比例缩放的固定宽或高的缩略图
优点:图片不会失真
缺点:缩略图有些部分需要进行额外填充(白色填充:补白)
等比例缩略图与固定缩略图的制作区别:在于需要通过计算来得出缩略图的宽和高
算法原理:
- 计算缩略图宽高比
- 计算原图宽高比
- 比较:
-
- 如果缩略图宽高比大于原图宽高比,将缩略图中用原图的高尽可能填满:缩略图的高是完整的,宽度不够(补白);
- 如果缩略图宽高比小于原图宽高比,将缩略图中用原图的宽尽可能填满:缩略图的宽是完整的,高度不够(补白)
- 把图片放到缩略图中间