PHP基础教程十七之会话技术COOKIE、SESSION
前言
我们用PHP开发后台的时候,需要对一些数据进行保存,而我们通常的做法就是进行数据库的保存,但是有时候我们一些是不需要保存在数据库中的,比如我们在登录网页的时候,在网站中显示我们上一次访问网站的时间,这个上一次访问的时间就可以不用保存在数据库中,同时我们在登录某个网页后,保存的登录的用户名,这些我们都可以不用保存在数据库中,而是使用PHP中的会话技术来解决。
会话的介绍
PHP的cookie技术和session技术都是针对会话来进行的。这里的会话可以理解为当一个用户打开一个浏览器,访问某个网站,从用户访问该网站开始,到用户关闭访问网站页面结束,我们称为一个会话。在一次会话过程中,用户可以点击该网站页面的各个超链接,可以点击多次。
当我们访问一个网站和网站里面的页面,知道我们推出这个网站。就是一次会话。
cookie讲解
我们有时候在访问某个网站的时候,一进入网站就可以在网页上看到我们上次访问当前网站的时间是多少。这个时间就可以使用cookie进行进行保存。
Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。注意cookie技术是写在浏览器端的文件。同时cookie的保存方式是以键值对的形式进行保存的。
从上面的流程图中可以看出来,在服务器的PHP文件中如果要创建cookie,则服务器把创建cookie的信息封装到http协议的响应头中进行信息的传递,浏览器接受到响应头后进行分析,知道了服务器需要在浏览器建立一个cookie,通过响应头的信息在本地创建一个cookie文件,当浏览器再次访问这个网站的时候会把本地的cookie信息发送给服务器。
Cookie:user=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
cookie的使用
关于cookie的使用,可以简单的理解为对cookie的增删改查操作。
cookie的创建
创建cookie其实很简单
<?php //通过setcookie函数进行cookie的创建 setcookie('username','abc',time()+3600);
我们通过setcookie()函数进行cookie的创建,该cookie会保存在浏览器的缓存中。
Set-Cookie:username=abc; expires=Mon, 17-Oct-2016 08:55:51 GMT; Max-Age=3600
setcookie(参数1,参数2,参数3)我们在代码中可以看到在这个函数中传进去了三个参数,
第一个参数是保存信息的键的名字。
第二个参数是键对应的值
第三个参数是这个cookie保存的时间,这里保存的时间是当前时间加上3600秒,当超过这个时间时,cookie将会失效。
当我们执行完上面的代码我们可以在浏览器的缓存文件中看到创建的cookie的文件,里面有我们的保存的数据。
username abc www.lijiafei.com/test3/ 1536 2120470400 30550100 480638768 30550092 *
cookie的读取
在上面我们进行了数据的保存,我们保存数据的目的就是读取数据,而cookie的读取可以理解为:
当浏览器请求某个网站的页面时,根据http协议规定: 该浏览器就会通过http的请求将该网站的cookie信息发送给服务器的请求页面
服务器接收到cookie信息后,就会封装到$_COOKIE数组中。
-
我们从$_COOKIE数组中进行读取。
<?php echo '<pre>'; //自动封装到这个数组里面 var_dump($_COOKIE); //通过键名取出值。 $username = $_COOKIE['username']; echo $username; ......结果....... array(3) { ["user"]=> string(3) "abc" ["username"]=> string(3) "abc" ["PHPSESSID"]=> string(26) "v6ntsa42f4v0h5jpaoa1tot8r6" } abc
当我们访问文件的时候,通过请求头把cookie信息传递过去。
Cookie:user=abc; username=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
cookie的修改
当我们想修改一个cookie的值的时候,仍然是使用setcookie来完成修改,但是如果cookie没有存在,则创建,如果已经有了,则修改。
<?php //通过setcookie函数进行修改,但是如果浏览器没有cookie则进行创建。 setcookie('username','abc123',time() + 1600);
我们在进行读取cookie的值可以看到成功的修改了里面的值。
array(3) { ["user"]=> string(3) "abc" ["username"]=> string(6) "abc123" ["PHPSESSID"]=> string(26) "v6ntsa42f4v0h5jpaoa1tot8r6" } abc123
cookie的删除,销毁
当我们不行使用到cookie的时候,可以进行手动的销毁cookie的值。
删除cookie的数据可以理解为两步,1、删除保存在浏览器缓存的cookie文件,2、删除保存在服务器$_COOKIE数组中数据。
<?php //使用setcookie这个函数进行删除 setcookie('username','',time()-1); //删除保存在$_COOKIE里面的数据 if(isset($_COOKIE['username'])){ unset($_COOKIE['username']); } //删除保存在浏览器中这个网站的所有的cookie foreach ($_COOKIE as $key => $value) { setcookie($key,$value,time()-1); } //销毁所有数据 unset($_COOKIE);
我们运行上面的代码就可以删除所有的cookie信息。
cookie的深入理解
上面的就是cookie最基本的操作。但是我们还有许多需要注意的地方:
一个Cookie只能标识一种字符串信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。就是说cookie 总是 名=值的形式保存。
在默认的情况下,我们创建多个的cookie,将保存在同一个文件中.
一个WEB站点可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie, 每个站点最多存放20个,每个Cookie的大小限制在4K,但是不同的浏览器,情况可能不同。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用setcookie()函数的第三个参数设置时间,并给出一个以秒为单位的时间。要删除 cookie 需要确保它的失效期是在过去,才能触发浏览器的删除机制。 就是说,我们的cookie默认的生命周期就是一个会话周期。如果希望设置,就需要 setcookie(‘name’, ‘val’, 时间)
如果希望cookie长久有效,可以这样创建cookie setCookie(“key”,”val”,PHP_INT_MAX);
setcookie()函数
我们可以看到在操作cookie的时候,都是通过setcookie进行不同的设置,但是我们在查帮助文档的时候,可以看到setcookie的参数并不是三个,而是可以七个参数。
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
而我们上面使用的就是前三个参数,设置键和值,同时设置保存的时间。
cookie有效路径
在setcookie()函数中第四个参数是控制cookie的有效路径的,当我们不设置的时候,默认的是当前路径和后台路径有效,但是当我们设置成’/’的时候,cookie全站有效。
案例目录结构:
...test |_readcookie.php(读取cookie信息) |_abc |_createcookie.php(创建cookie) |_def |_readcookie.php(读取cookie);
两个readcookie.php代码一样:
<?php echo '<pre>'; var_dump($_COOKIE);
创建cookie的代码:
<?php //创建cookie保存数据 setcookie('user','abc',time() + 1600,''); //再创建一个cookie信息,这两个cookie会保存在一个cookie文件里面 setcookie('password','123',time() + 1600,'/');
创建cookie的时候,第一个键值使用默认的有效路径第二个键值使用全站的有效路径。
当访问test目录下的readcookie.php文件时,只能显示password-123的键值信息。
array(1) { ["password"]=> string(3) "123" }
cookie域名共享
我们在开发中可能出现在一个网站(www.test.com)下面有两个域(www.a.test.com,www.b.test.com)名,如果我们不对cookie进行设置,这两个域名是不能互相访问对方的cookie的,但是如果我们对cookie进行设置,就可以实现域名共享。而setcookie()的第五个参数就是控制域名共享的。
<?php //设置第五个参数表示两个域名可以共享cookie数据。 setcookie('username','abc','','','.test.com');
cookie安全传输
在我们在浏览网页的时候,大多数使用的的协议是HTTP协议,但是还有一种协议是HTTPs协议,这种协议比http协议更加安全,在开发中有时候当我们需要对某些重要的cookie数据必须在https协议下才能被传输,这是就会用到setcookie()函数的第六个参数进行设置。
<?php //第五个参数设置为false表示可以在http协议和https协议下传输。 setcookie('username','abc','','','',false); //第五个参数设置为false表示只能在https协议下传输。 setcookie('password','123','','','',true);
cookie的httponly
在默认情况下,cookie值是可以被其他脚本获取的,比如是JavaScript,这是就可能存在安全问题,那我们怎么防止其他脚本来读取cookie呢?
在setcookie()函数的最后一个参数就是控制cookie只能http协议进行读取。
<?php //最后一个参数,设置为true表示只能是https协议进行读取。 setcookie('username','abc','','','',false,false);
上面的就是对会话技术cookie的介绍。在会话技术中还有之中技术也就是session。
session讲解
在我们登录网页时,输入正确的账号和密码后,我们可以使用会话技术的session技术进行保存数据。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session文件,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务
当我们在服务器需要创建一个session的时候,会在服务器创建一个session文件,并且每个会话独享一份session文件,在服务器session文件默认存在在 c:/windows/temp 目录, 但是我们也可以在php.ini中进行修改。当服务器创建session后,会在返回数据的时候把session的id号封装到http协议的响应头中。
SetCookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70; path=/
这个响应信息和创建cookie的信息很想,但是浏览器并不会在浏览器的缓存中创建cookie文件。当浏览器保存住session的ID后,如果又要访问网页,浏览器会把session的ID封装在请求头中发送给服务器。
Cookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70
session操作
session的操作大致也可以分为增删改查四个步骤。
但是不管是什么操作都需要在操作前开启session机制,使用sessio_start()函数进行开启。同时session数据的保存也是通过键值对的方式进行保存的。session保存的数据类型可以是int,float,boolean,string,array,object。
session的创建
<?php //开启session机制 session_start(); //把数据保存在$_SESSION数组里面。 $_SESSION['user'] = 'abc';
先开启session机制,然后把需要的数据保存在$_SESSION数组里面当我们运行代码可以在http协议的响应头中添加了一段话:
Set-Cookie:PHPSESSID=p4lsn4vrdjtmkou1qc3tn3n577; path=/
同时我们也可以参看我们在服务器保存的session文件。
user|s:3:"abc";
session的读取
<?php //先开启session机制 session_start(); echo '<pre>'; //保存在session里面的数据会自动封装到$_SESSION数组里面 var_dump($_SESSION); ......结果...... array(1) { ["user"]=> string(3) "abc" }
当我们读取session的数据的时候,先开启session机制,这样服务器就会把session文件里面的数据封装到$_SESSION数组中,从而就可以对数据进行操作。
session的修改
session的修改和cookie的修改是一样的,session怎么创建,就怎么修改,如果数据不存在就创建,如果数据存在就修改。
session的删除
当我们不需要某些session数据的时候,我们可以进行数据的删除,当然,我们可以删除一个数据,也可以删除全部数据,甚至也可以删除session文件。
<?php session_start(); // if(isset($_SESSION['user'])){ // //删除其中一个数据 // unset($_SESSION['user']); // } // //通过循环删除全部的数据。 // foreach ($_SESSION as $key => $value) { // unset($_SESSION[$key]); // } //删除session文件 session_destroy();
我们可以根据自己的需求进行不同数据的删除。
从上面的讲解中可以看到操作session的函数并不像cookie一样只是一个函数,关于session的操作函数有许多。
session的深入了解
session启动方式
在上面我们都是使用了session_start()函数来启动session机制,其实PHP给我们提供了两种方式来开启session
直接在php文件中使用session_start()函数;这种方式比较灵活,推荐使用这种方式。
直接在php.ini 文件中,配置session.auto_start = 1 设置1就可以自动打开session机制. 默认情况下这个值是 0,这种方式不推荐使用。
session的安全设置
关于session的安全和cookie的安全设置一样,但是session不是通过函数的参数进行设置的,而是在php.ini文件中进行配置的。其中有几个关键的值:
session.save_path:session数据保存在服务器的路径。
session.cookie_secure:这个参数的作用和cookie很像,在传输给服务器时,是否安全传输,即是否使用https传输。
session.cookie_httponly:只能http协议进行读取。
session.cookie_domain:在传输给服务器时,有效域名的设置。
上面的参数我们都是直接在php.ini配置里面修改的,这种修改是永久性的,但有时我们要求只是临时的修改php.ini文件,就可以使用ini_set()函数进行配置。ini_set函数可以去临时修改php.ini 的设置,而且设置只对当前的这个会话有影响。但是有一点ini_set函数要在 session_start()前,才能生效.
session的存储机制
在上面我们在使用session的时候,只是简单的进行session_start()函数开启session机制,并且把数据封装到$_SESSION数组里面,但是我们并没有了解其中的过程,数据是怎么存储在数组里面,又是在什么时候保存在session文件中的,当destroy掉session文件的时候又是在哪里进行执行的,都没有了解。
session的存储机制大致可以分为三步,从session_start开始,到一个文件运行结束
在session_start()开启session机制后,
判断浏览器传过来的数据中是否带有session_id,如果有就使用,没有就创建一个session文件。
将session文件中的数据读取到$_SESSION数组中。
启用session的垃圾回收机制,判断哪些session是失效的,删除失效的session文件。
在脚本周期内,我们可以对$_SESSION数组进行增删改查的操作,注意在这里操作的数据并不会对保存在服务器端的session文件有影响。同时如果在这里使用session_destroy(),就会删除session文件并关闭session机制。
在脚本结束时,先判断session机制是否关闭,如果没有关闭就会把$_SESSION数组里面的数据写入session文件。
上面就是session的存储机制,理解并掌握存储机制,对我们使用session有很好的帮助。
session的GC
在上面的存储机制中我们知道在开启session机制后第一步中通过判断哪些是无效的文件,然后session会启用垃圾回收机制(GC)进行回收,但是并不是每此开启都要进行回收的,其实在php.ini文件中有两个参数,设置了启用gc的概率。
session.gc_probability
session.gc_pisor= 10000
它们是一对,表示垃圾回收的概率是多少,而概率的计算公式是session.gc_probability/ session.gc_pisor = 1/10000, 就是说,当调用10000次session_start() 函数,有一次会触发垃圾回收机制。
但是针对不同的网站我们设置不同的概率,对于大型网站,session.gc_pisor 设置大点,比如10000, 中型网站 500-1000, 小网站, 200-300,避免频繁的触发GC。
总结
会话技术cookie和session在PHP开发中用到的还是很多的,理解两个技术不同的特点,让我们在开发中更加灵活的存储不同的数据。
以上就是PHP基础教程十七之会话技术COOKIE、SESSION的内容,更多相关内容请关注PHP中文网(www.php.cn)!