session与PHP之session_start()
Posted hyt前端小菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了session与PHP之session_start()相关的知识,希望对你有一定的参考价值。
官方手册:http://www.php.net/session_start
Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。
需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
session的工作原理
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中, 这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
session存储在服务器端,默认情况下,php.ini 中设置的 SESSION 保存方式是 files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。
如果访问量大,可能产生的 SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数,save_path 为开始目录。
当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是php中的Session与Cookie
在PHP开发中对比起Cookie,session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 session 的使用。
由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。
对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能只做一次验证。为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安全。
而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作当然使用 session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应的 SESSION 变量。了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的
用$_SESION之前必须要session_start()----其中之一的功能,$_SESSION是服务器端的cookie,相当一个大数组(浏览器关闭前,和session销毁前)$_SESSION中的数据可以一直用(除了重新赋值)。 $_SESSION 好比一个数组 $_SESSION[‘name‘] = ‘caocao‘ 这好比在数组中加了一个元素,相当于$_SESSION = array("name"=>"caocao") 使用的时候 还要使用$_SESSION[‘name‘] 才能得到‘caocao‘。
session_start();
告诉服务器使用session。一般来说,php是不会主动使用session的。
不过可以设置php.ini中的session.auto_start=1来自动对每个请求使用。
而用了session_start(),或者自动开启session,
服务器会根据请求头部传来的cookie中或url中的PHPSESSID来确认此sessionid对应的$_SESSION数组。
告诉服务器使用session。一般来说,php是不会主动使用session的。
不过可以设置php.ini中的session.auto_start=1来自动对每个请求使用。
而用了session_start(),或者自动开启session,
服务器会根据请求头部传来的cookie中或url中的PHPSESSID来确认此sessionid对应的$_SESSION数组。
thinkphp中不用进行session_start(),因为thinkPHP对其有进行封装,待仔细验证。
以上是关于session与PHP之session_start()的主要内容,如果未能解决你的问题,请参考以下文章
与 session_start() 相关的登录时开始但在其他页面上不起作用
PHP session_start() 函数:为啥我每次使用与 PHP 会话相关的任何东西时都需要它