解决php项目中session失效的方法

简介:

解决php项目中session失效的方法

今天下班坐班车,快到站的时候,上家公司的leader发了个qq给我,意思是救火,下车后回来在电脑上详细问了下,leader的描述如下

[cpp] view plain copy

  1. 这个地址  你帮我看下 为啥上传完试卷发布任务  设置答题卡的时候  session就没了

因为这个项目一开始后台都是我一人开发的,因此很快就找到了问题所在。流程为:用户通过js组件上传试卷,在上传试卷的方法中通过session存储刚刚上传的试卷详细信息,如名称、后缀、存入资源表的ID等,上传成功后,再点击页面上的其他选项,如学校、年级、难易度等,最后点击提交,在提交处理的方法里,一开始便判断刚刚上传的session值是否存在,不存在便跳到试卷首页。我在此方法中打印了$_SESSION,没有值,奇怪了,以前还是好好的。于是我问了下,啥时候开始的,leader说下午快下班时,老师打电话说上传试卷设置答题卡不成功,老跳转。接着又问了下,动服务器环境了么,leader说没有。

既然出现了问题,那就解决问题呗。正好这段时间在看《PHP核心技术与最佳实践》一书,里面就对session和cookie有详细的描述,同时也加深了我对二者的理解。于是我先打开php的配置文件,找到session相关的配置项,发现session.save_path为/data2/session,我记得以前都是设置为/data1/session的,怎么变了。于是我退出来去看看此路径,一开始我以为是该目录权限不够,后来一看,压根就没有该目录,难怪每个session不会跨页面。于是新建文件,设置权限,再上传,一切又恢复正常了。

写到这,我也想再唠叨下session相关的技术点。session是存储在服务器端的,默认是以文件方式存储的(session.save_handler = files)。那session是如何产生的呢?session是通过session_start()函数产生的 ,当此函数运行时,在session存储的目录里生成一个文件和唯一一个与之对应的session id,通过session id可以取出该session文件的数据。由于每次运行session_start()都会产生新的seession文件,那么如何利用到以前生成session文件呢,只需session_start($session_id),那么便不会新产生session文件了,而会去读session id对应的session文件。session id在默认情况下都是使用在客户端(浏览器)的cookie来保存session id(在chrome浏览器上按F12键,点击Resources-cookies,可以看到),使用$_COOKIE['PHPSESSID']可以获取。那个PHPSESSID是session id的默认名称,在php.ini里可以通过session.name来设置,在脚本中用session_name()来获取session id的名称。每次浏览器和服务器对话时,浏览器都会把session id传给服务器的,服务器会依据传递过来的session id找到相应的session文件获取相应信息进行相关操作。而一旦客户端(浏览器)禁用了cookie,那么服务器端变不会接收到session id,此时需要显示传递session id了。两种方法:手动通过URL传递session id;隐藏表单传递session id。上述两种方法需要服务端的php环境中session.use_trans_sid 值为 1。

啰嗦了那么多,最后还是linus那句话,“talk is cheap,show me the code”。

[cpp] view plain copy

  1. <?php
  2. session_start();
  3. $_SESSION['arr'] = array('name' => 'molaifeng''hobby' => 'php');
  4. ?>
  5. <a href="testSession.php?<?php echo session_name(); ?>=<?php echo session_id()?>">testSession</a>

 

[cpp] view plain copy

  1. <?php
  2. session_start($_REQUEST[session_name()]);
  3. print_r($_SESSION);

代码都看懂的吧,就不解释了。

最后总结下吧,一般情况下出现跨页面session失效,基本上是上述列出的几点。1、session.save_path有误,如权限不够,或是目录不存在;2、服务器php配置中的session.use_trans_sid值为0;3、客户端禁用了cookie。不过我觉得第一种情况出现的频率应该挺高的。

原文地址http://www.bieryun.com/1809.html

相关文章
|
6月前
|
安全 API PHP
PHP中实现CORS跨域资源共享的方法
通过这种方式,你可以在PHP应用中灵活地实现CORS,以支持跨域Web应用的需求。
453 15
|
7月前
|
Web App开发 安全 PHP
刚上线的PHP项目被攻击了怎么办
近期因忙于多个项目,代码质量有所疏忽,导致项目上线后遭攻击。攻击者通过文件上传漏洞和测试登录方式入侵,修改了 index.php 并植入恶意文件。经排查,问题源于未限制上传文件类型及未关闭测试登录配置。修复措施包括锁定文件、限制上传后缀、关闭测试登录、删除高危用户并限制其访问。此次事件提醒我们,细节疏漏可能引发严重风险,需时刻保持警惕。
|
9月前
|
JavaScript Linux PHP
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
256 3
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
|
7月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
689 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
9月前
|
存储 缓存 安全
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
439 2
|
9月前
|
PHP
Composer在PHP项目中的手动类自动加载策略
为了确保文件名和类名的一致性及其可预测性,类名通常应该与文件名相匹配,所有的类都应属于一个命名空间,并且目录结构应该反映命名空间的结构。如此一来,当新的类被创建时,它们会自动遵守已有的约定,从而无需修改自动加载逻辑,确保了代码的模块化和可管理性。
117 8
|
10月前
|
安全 API PHP
Composer在现代PHP项目中的进阶实践
简介:本文深入探讨PHP依赖管理工具Composer的核心功能与企业实践。首先介绍其如何通过`composer.json`实现声明式依赖管理,变革PHP生态;接着解析自动加载优化、版本策略(如`~`和`^`)及私有仓库集成等关键特性;然后分享CI/CD集成、多环境配置与性能优化技巧(如阿里云镜像加速)的企业级方案;最后提供常见问题排查方法,如内存不足和依赖冲突解决,助力开发者高效管理项目依赖。
225 3
|
Ubuntu PHP Apache
在Ubuntu系统中为apt的apache2编译PHP 7.1的方法
以上就是在Ubuntu系统中为apt的apache2编译PHP 7.1的方法。希望这个指南能帮助你成功编译PHP 7.1,并在你的Apache服务器上运行PHP应用。
302 28
|
PHP 开发者
PHP数据验证方法:如何检查一个字符串是否是email格式。
以上就是关于PHP如何检查一个字符串是否是email格式的全部内容。希望你在代码书写旅途中,能找到你的北斗星——简洁、高效、可靠的代码验证方式。让我们共同见证PHP的强大和丰富多彩!
281 16
下一篇
开通oss服务