ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
#### cookie 的存取 `注意`:由于实验楼的在线环境配置的默认路径不在`/usr/share/nginx/html`,需要先修改配置。 ~~~bash sudo vim /etc/nginx/sites-available/default ~~~ 将`root /home/shiyanlou/Code/myWeb/public;`替换为`root /usr/share/nginx/html;`然后重新加载 nginx 配置并开启 nginx 服务器: ~~~sh sudo service nginx reload sudo service nginx start ~~~ 进入 Web 根目录: ~~~sh cd /usr/share/nginx/html ~~~ 修改读写权限: ~~~sh sudo chmod -R 777 /usr/share/nginx/html ~~~ 在 Web 根目录下新建`cookie1.php`,写入以下代码 ~~~php <?php //演示如何创建cookies信息 //把用户名和密码保存在客户端的cookies //这个函数用来保存cookie //key--value的形式保存 setcookie("name","shiyanlou",time()+3600); echo "success!"; ?> ~~~ 确保 php 服务已经启动,若未启动请执行以下命令: ~~~bash sudo service php7.2-fpm start ~~~ 打开`Firefox`浏览器,输入地址:`localhost/cookie1.php`。 ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid108299labid1395timestamp1484362625681.png) 输出`success!`,说明我们的 cookie 信息已经被成功写入。按照上面的流程,查看此时浏览器中全部 cookie 信息,就会发现了多个一条记录: ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid108299labid1395timestamp1484362809999.png) 因为我们这里只有一个请求,所以还可以通过另外一种方式查看 cookie 信息: ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid108299labid1395timestamp1484363107905.png) 这是它的一个初步使用. 注意保存多少时间是`time()+3600`,`time()`是当前的 Unix 时间戳。 代码说明: > 当浏览器访问 cookie1.php 页面的时候,我们的服务器就会以 Set-Cookie:name=xxx;expires=xxxx 回送 http 响应,当浏览器获取到该信息后,就会保存该 cookie 到新的 xxx 文件 > > 如果我们没有时间参数 cookie 不会保存到客户端,当浏览器的会话结束,我们的 cookie 就会失效。 > > cookie 保存的信息形式:键值对形式,客户端可以保存多个键值对 > > cookie 可以保存中文,但是会进行 urlencode 编码 > > cookie 可以有多个键值对(而 session 是统一的),还可以给不同的键值对指定不同的有效时间 **把 cookie 取出来(超时之后就取不出来了)。** 新建`cookie2.php`: ~~~php //cookie2.php <?php //获取cookie信息 echo "<pre>"; print_r($_COOKIE); echo "<pre>"; $name=$_COOKIE['name']; echo "name".$name; ?> ~~~ ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid108299labid1395timestamp1484363418237.png) 因为在`cookie1.php`中,我们将 cookie 的有效时间设置为当前时间+3600s,即有效期为一小时。所以现在是能够取到的,为了方便测试,这里讲`cookie1.php`中 cookie 的有效期设置为 5s。当然,如果你愿意等一个小时的话,也是可以的。修改之后,执行`cookie1.php`,等待 5s 之后,再执行`cookie2.php`: ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid108299labid1395timestamp1484363700284.png) `cookie`可以分别设置各个键值对保存的时间,如: ~~~txt * setcookie('name','shiyahlou',time()+100) * setcookie('age',10,time()+200). ~~~ #### cookie 过期 上面的代码说明了`cookie`过了有效期之后,就会失效,为什么呢?其实这个跟 http 协议有关,它发包的时候没有带 cookie 了(因为超时过期了),http 协议规定要携带网站 cookie,所有 Web 开发都遵循此规范。 这个机制是 http 协议规定的。 可以保存多个数据,使用明文方式!!所以如果用 cookie 来保存密码是非常危险的。 ~~~php setcookie("name","passwd",time()+3600); setcookies("name","shiyanlou1",time()+60); //这个值在一分钟后会过期 setcookies("name","shiyanlou2",time()+3600); setcookies("name","shiyanlou3",time()+3600); setcookies("name","shiyanlou4",time()+3600); ~~~ #### cookie 的更新与删除 > 更新 如何更新 cookie 信息?首先必须是是针对一个用户,`setcookie`会覆盖之前的记录,在  `/usr/share/nginx/html`  目录下创建文件  `cookie3.php` ,编辑如下: ~~~php <?php setcookie("name","shiyanlou",time()+300); echo "name is shiyanlou! <br>"; //更新 setcookie("name","chengdu",time()+300); echo "update record, name is chengdu";; ?> ~~~ 自己可以试试哦,打开浏览器,输入  `localhost/cookie3.php`,再次查看 cookie 信息,发现果然变化了。 ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid108299labid1396timestamp1484375367381.png) > 删除 其实删除数据是通过修改 cookie 的有效时间来实现的。 > 1. 删除指定键值 > 2. 删除所有键值对 指定删除某一个 > * keyval > * 说白了其实就是减少它存在的时间,让保存时间过期,时间减少多少都可以 在  `/usr/share/nginx/html`  目录下创建  `cookie4.php` ,编辑如下: ~~~php <?php //删除指定键名cookie setcookie("key","",time()-200); //删除所有,当全部删掉的时候,文件夹也会被删掉 foreach($_COOKIES as $key => $val) { setcookie($key, "", time()-1); } ?> ~~~