今天在开发一个后台管理程序,访问路径是:
你的域名/admin/index.php
由于这是一个后台管理程序,后台有大量的“post表单数据提交”操作,为了防止一些恶意提交数据、CSRF(跨站请求伪造)、表单重复提交数据......等等。需要使用“token”,关于token的作用及原理这里就不多讲了。
由于需要使用“token”的地方很多,我就把:
session_start()
放在了 index.php 这个入口文件。
然后,我发现了一个问题,就算我用:
session_unset();
session_destroy(); //删除session所有资源,包括session存储文件
彻底销毁了session,删除session所有资源,包括session存储文件。
由于 index.php 是入口文件,不管你访问哪个页面?只要你访问了 index.php ,也就是PHP代码走了 session_start() 这行代码,就会给你分配一个0KB的session空文件。
示例如下:
我分别用谷歌、QQ、IE浏览器访问了 /admin/index.php,结果如下:
我们暂时先不考虑:
session.gc_maxlifetime 指定过了多少秒之后session数据就会被视为 "垃圾" 并被清除。
试想一下,如果有十万个人都来请求这个URL,是不是就会分配十万个0KB的session空文件呢?就算是0KB,也会占服务器相应的资源吧!这就是为什么大项目需要单独搞session服务器了。
解决思路也很简单:
1、我不把 session_start() 这行代码放 index.php 这个主文件就行了呗!
2、哪个文件需要,我就去哪个文件再开启session_start(),然后再销毁删除。这样虽然麻烦,但是,至少会避免一些少生成0KB的session空文件。
3、如果不是很重要的东西,完全可以用 $_COOKIE,像我这种token类似的功能,完全可以用cookie。
总结:
虽然说PHP也用了很多年了,也开发过不少项目,以前只知道随意用 session_start() ,具体这些背后的东西也没怎么观察过,更没有了解过,今天特意分享给大家一下。