解决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

相关文章
|
23天前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
43 4
|
1月前
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
48 12
|
3月前
|
Java PHP 数据安全/隐私保护
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
本文详细介绍了PHP面向对象编程的一系列核心概念和用法,包括构造函数、析构函数、继承、方法重写、访问控制、接口、抽象类、静态成员、final关键字、以及this、self、parent这三个关键字的异同和作用。通过具体示例代码,展示了如何在PHP中使用这些面向对象的特性,以及它们在实际开发中的应用。
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
|
3月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
3月前
|
域名解析 关系型数据库 MySQL
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
该文章指导如何使用PHPEnv搭建本地PHP开发环境,并通过一个简单的"Hello World"程序演示从安装到运行的全过程。
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
3月前
|
设计模式 数据管理 测试技术
PHP中的设计模式:单一职责原则在实战项目中的应用
在软件开发中,设计模式是解决问题的最佳实践。本文通过分析单一职责原则(SRP),探讨了如何运用这一原则来提升PHP项目的可维护性和扩展性。我们将从实际案例出发,展示单一职责原则在业务逻辑分离、代码解耦和提高测试效率方面的应用。无论是新手还是经验丰富的开发者,都能从中获益,进而编写出更健壮、更灵活的PHP代码。
40 5
|
3月前
|
PHP UED 开发者
PHP中处理异常的现代方法
【9月更文挑战第26天】在PHP的世界里,异常处理是代码健壮性的守护神。本文将深入浅出地探讨如何在PHP项目中优雅地处理异常,从而避免程序崩溃并提升用户体验。
|
3月前
|
IDE 安全 网络安全
Xdebug 在不同版本的 PHP 中配置方法有什么不同?
Xdebug 在不同版本的 PHP 中配置方法有什么不同?
217 4