04mvc框架原理(8days)04

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04mvc框架原理(8days)04相关的知识,希望对你有一定的参考价值。

session操作

session详细使用

session的开启

session_start();

?

自动开启

session可以自动开启!在当前的脚本执行之前,就完成开启!

通过php的配置文件,修改即可!

技术分享

?

注意,在session已经开启的情况下再开启,则会触发错误!

技术分享

?

因此典型的开启session是如下的代码:

技术分享

?

session_start()前的输出问题

session_start前也不应该有任何的输出,因为可能会使用到响应头信息(类似于header函数)

技术分享

?

?

$_SESSION的使用

$_SESSION 变量只能是字符串下标数组,不支持数值下标数组!

技术分享

?

没有session_start时是没有$_SESSION的。

但是语法上可以向一个普通数组一样处理,此时不会对_SESSION内的数据做保存!

?

删除session

删除某个session数据

unset($_SESSION[‘key‘]);

?

删除所有的session数据

技术分享

注意,不能unset($_SESSION);

技术分享但是:

技术分享

?

删除session的文件

session_destroy()

技术分享

session_destroy()只删除文件,不处理$_SESSION变量!

因此$_SESSION是有值的!

技术分享

但是,一旦执行了session_destroy(),则在脚本结束,不会在执行写操作!

?

如何完全删除一个session?

将于当前session相关的数据都删除掉。

$_SESSION: unset,或者$_SESSION=array()

session文件: session_destroy();

cookie中的sessionID: secookie(‘PHPSESSID‘, ‘‘, time()-1);

技术分享

?

?

服务器端session数据的处理

处理服务器上所保存的session数据的文件

修改保存目录

?

默认的保存在系统临时目录下,windows/temp下:

技术分享

?

可以通过修改 php的配置。session.save_path进行修改!

技术分享

技术分享

注意,php不能自动创建该目录:

技术分享

?

?

分子目录保存session文件

每个session一个session文件,当请求变多时,session文件增多! 分子目录保存!

?

通过 修改 session.save_path完成!

技术分享

在temp下,分1级子目录的形式保存:

技术分享

应该放在t目录下:

使用 sessionid的相应字母完成判断放入到哪个目录!

也是不能自动创建子目录!需要手动创建需要的子目录!

究竟应该创建好多少个?由sessionid字符的可能性!

通过下面两个配置得到:

sessionid的形成算法来决定:

技术分享

技术分享

2^5可能性!

?

session数据入库

重写session的存储机制!

?

?

session面临的问题:

1量大!难管理

2服务器多,难共享!

?

将session数据,放置在数据库服务器上进行保存管理!(内存)

?

将session数据存入到数据库中!

?

分析:

需要的工作

提供可以操作数据的功能代码!(读,写,删除)

告知php,在需要的时候,调用我们所定义的代码!

?

增加六个session存储的处理函数(方法)

技术分享

将以上六个方法设置到session处理的各个部分

利用系统函数,设置session存储所需要的处理器,为当前定义好的 这六个函数:

session_set_save_handler();

技术分享

技术分享

?

?

增加一个表保存session数据

保存在文件中变成保存到数据表中!

一个文件对应????一条记录

文件名????????????某个字段,sessionID

文件内容????????字段,当前session数据

技术分享

完善六个函数,处理session数据

*读,read

在session_start()session执行!

技术分享

?

?

*写,write

技术分享

?

*销毁,destroy

在调用了 session_destroy()系统函数时,被自动调用!

负责的功能时,利用当前id,删除当前的session记录!

技术分享

?

初始化,open

在session开启时执行,负责完成session存储所需要资源的初始化工作!

技术分享

?

关闭,close

在整体session存储机制结束时,负责释放占用的资源!

?

技术分享

?

垃圾回收,gc

如果一条记录(一个文件)在多久之内,没有被使用过了,则认为该数据是垃圾!

默认的时间,是1440s秒。24分钟!可以通过php的配置:

技术分享

?

什么时候执行删除的动作?

在session_start()时,有一定的几率,执行垃圾回收!

默认是 1/1000 千分之一!

可以通过php修改:

技术分享

技术分享

技术分享

?

需要增加一个字段,表示当前记录的最后修改时间

技术分享

在,插入或者更新时,都要将时间设置成当前的时间戳

修改写的方法,增加对该字段的处理:

技术分享

?

此时,需要在垃圾回收函数内,判断哪些记录是否过期,删除!

技术分享

?

?

技术分享

?

?

?

session常用处理

session与cookie的区别与联系?

?

session 的 sessionID存在 cookie内!

?

session数据有效期?原因是什么?

浏览器关闭。

原因是保存在浏览器端的sessionid丢失!

默认的sessionID的cookie变量是临时的cookie变量!

?

如何持久化session?

?

持久化sessionID这个cookie变量

?

使用函数:session_id函数得到当前的sessionID!

技术分享

?

php还提供一个专门的修改sessionID的cookie变量的函数:

session_set_cookie_params();设置该cookie变量的选项的!

技术分享

在表示有效期的第一个参数,是时间周期,而不是时间戳!

技术分享

留意,应该在session-start()之前,就完成cookie选项的设置!

(类似于 session_set_save_handler一样)

?

此外还应该保证,服务器端垃圾判定的时间要与session持久化的时间尽量一致!

session.gc_maxlifetime = 3600;

?

留意,少用!

?

cookie禁用session是否可用?

session是基于cookie的,因此cookie禁用,session不应该可用!

?

如果非要用,也是可以的!

办法是:

url上传递sessionID!

?

此时,需要修改php的配置达到目的:

1,开启对url上传递的支持!将仅仅使用cookie传递sessionid关闭!

技术分享

?

2,增加url上参数

技术分享

?

此时php就在浏览器没有cookie使用的情况下,可以采用url进行sessionID的传递:

?

技术分享

?

注意,php只会自动在html代码的a连接的地址上增加url的传递SessionID

php代码内的url不能自动增加!

技术分享

?

tip:表单请求时,该参数如何传递!php会自动增加表单项隐藏域,name="PHPSESSID" 值为="session_ID()"

?

无限分类

商品分类!

?

无限分类,就是树状列表的展示!

?

利用 关系型数据库 与 php业务逻辑,实现一个树状分类列表的展示

?

树状列表

技术分享

?

树:N个节点,与N-1条边,组成一种结构,要求,每一个节点都要有一条边指向另一个节点,除了根!

节点:

边:指明一个节点与另一个节点的之间关系!

?

根节点:

子节点:

父节点:

祖先节点(先辈节点):

后代节点:

兄弟节点:

叶子节点:

?

一个分类就是一个节点!

而分类之间的关系,就是一条边!

?

?

设计分类表

表:关系型!每个分类就是一条记录!

结果:树!每个分类就是一个节点!

?

如何利用关系型表,表示,树结构!

?

?

只要在分类上记录,其边(父类的标识)即可!

?

增加一个字段,保存其父分类的ID即可!

?

两部分:

分类自然信息!

分类的父ID!

技术分享

?

先从 查询树状列表完成!

先插入模拟数据:

?

根节点的父分类ID为0。没有!

技术分享

?

简单分类列表

控制器

新增一个后台的分类管理控制器类!

app/controller/back/CategoryController.class.php

增加一个列表动作:

并完成:

技术分享

?

模型

增加分类表操作模型

并增加一个方法返回所有数据getList

app/model/CategoryModel.class.php

技术分享

?

视图

展示分类

增加模板!

app/view/back/category_list.html

技术分享

?

?

其他

增加一个菜单链接,点击请求到当前分类类表动作!

修改menu.html即可!

技术分享

技术分享

?

树状分类列表

?

按照级别缩进

按照上下级关系,对数据排序

?

排序

单纯按照某个字段排序!

而是应该按照级别关系进行排序!

?

利用 0 先找到顶级根节点。再利用该根节点找其子节点,当找到第一个子节点时,利用该子节点,再找下级节点!直到当前子节点上所有的后代节点都查找到,才会去执行下一个根节点的子节点!

?

如何实现:

典型的递归方式解决!

?

递归点,和递归出口:出口在,如果当前节点没有子节点,则不需要递归调用!

?

编程实现:

按照父分类id,查找子分类的过程!其中一直需要从所有的数据分类中查找!

?

一步:获得所有的分类!放入到数组列表!

二步:在该数组列表内,完成上面的递归查找!

技术分享

技术分享

?

确定分类的缩进级别

递归的运行图:

技术分享

分析发现:

分类应该缩进的级别,与递归找到该分类的函数的调用深度是一致的!

?

?

因此,需要记录递归调用的深度!

?

递归调用一次,深度+1

利用一个参数即可!将参数的值,每次递归时,值被+1:

将深度赋值个当前函数确定的分类即可!

技术分享

利用级别缩进:

字符串函数:

重复的结果:str_repeat(‘需要重复的字符串‘, 次数);

重复字符串!可将一个字符串重复多少次!

技术分享

?

?

更新项目简单列表为树状列表

?

控制器

修改获得数据的调用的模型方法

app/controller/back/CategoryController.class.php

技术分享

模型

增加一个getTreeList方法,获得排序和计算好深度的分类列表数据

app/model/CategoryModel.class.php

技术分享

在来一个 getTree完成递归:

技术分享

视图

增加缩进的展示

app/view/back/category_list.html

技术分享

?

?

结果:

技术分享

以上是关于04mvc框架原理(8days)04的主要内容,如果未能解决你的问题,请参考以下文章

04mvc框架原理(8days)01

04mvc框架原理(8days)06

04mvc框架原理(8days)05

04mvc框架原理(8days)03

04-JavaWeb开发JSP&EL&JSTL&MVC&Bootstrap前端框架

窥探ASP.Net MVC底层原理 实现跨越Session的分布式TempData