首页 后端开发 php教程 php session跟cookie使用说明

php session跟cookie使用说明

Jun 13, 2016 am 11:37 AM
cookie php session setcookie

php session和cookie使用说明

1. PHP的COOKIE?

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。PHP在http协议的头信息里发送cookie, 因此setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对header() 函数的限制类似。1.1 设置cookie:?
可以用setcookie() 或setrawcookie() 函数来设置cookie。也可以通过向客户端直接发送http头来设置.?
1.1.1 使用setcookie()函数设置cookie:?
bool setcookie( stringname [, stringvalue [, int expire [, stringpath [, stringdomain [, bool secure [, bool httponly]]]]]] )?
name: cookie变量名value: cookie变量的值expire: 有效期结束的时间,?
path: 有效目录,?
domain: 有效域名,顶级域唯一secure: 如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.?
例子:?

复制代码代码如下:

$value= 'something from somewhere';?
setcookie("TestCookie", $value);?
/* 简单cookie设置*/setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时*/setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录/~rasmus,有效域名example.com及其所有子域名*/?
?>?


设置多个cookie变量: setcookie('var[a]','value');用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var'][‘a']来读取该COOKIE变量.?

1.1.2. 使用header()设置cookie;?
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[; ]]");?
后面的参数和上面列出setcookie函数的参数一样.?
比如:?

复制代码代码如下:

$value= 'something from somewhere';?
header("Set-Cookie:name=$value");?


1.2 Cookie的读取:?

直接用php内置超级全局变量$_COOKIE就可以读取浏览器端的cookie.?
上面例子中设置了cookie"TestCookie",现在我们来读取:?

print$_COOKIE['TestCookie'];?

COOKIE是不是被输出了?!?

1.3 删除cookie?
只需把有效时间设为小于当前时间, 和把值设置为空.例如:?
setcookie("name","",time()-1);?
用header()类似.?

1.4 常见问题解决:?

1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.?
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义3) 使用的时候,有必要测试用户是否支持cookie?
?

1.5 cookie工作机理:?

有些学习者比较冲动,没心思把原理研究,所以我把它放后面.?
a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).?
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.?

HTTP/1.x 200 OK?
X-Powered-By: PHP/5.2.1?
Set-Cookie: TestCookie=something from somewhere; path=/?
Expires: Thu, 19 Nov 2007 18:52:00 GMT?
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0?
Pragma: no-cache?
Content-type: text/html?

这一行实现了cookie功能,收到这行后Set-Cookie: TestCookie=something from somewhere; path=/?
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:?

TestCookie=something from somewhere;?
这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果.也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果.?
?



2. PHP的Session?

session使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.web应用程序存贮与这些session相关的数据,并且让数据随着用户在页面之间传递.?

访问网站的来客会被分配一个唯一的标识符,即所谓的会话ID。它要么存放在客户端的cookie,要么经由URL 传递。会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP 会自动(如果session.auto_start 被设为1)或在用户请求时(由session_start() 明确调用或session_register() 暗中调用)检查请求中是否发送了特定的会话ID。如果是,则之前保存的环境就被重建。2.1 sessionID的传送2.1.1 通过cookie传送sessin ID?

使用session_start()调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该cookie与客户端进行交互.?
session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互.?
即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id(); path=/');?
即setcookie(session_name(),session_id());?
当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.?

2.1.2 通过URL传送session ID?
只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法.
xxx,也可以通过POST来传递session值.?

2.2 session基本用法实例?

复制代码代码如下:

// page1.php?
session_start();?
echo'Welcome to page #1';?
/* 创建session变量并给session变量赋值*/$_SESSION['favcolor'] = 'green';?
$_SESSION['animal'] = 'cat';?
$_SESSION['time'] = time();?

// 如果客户端使用cookie,可直接传递session到page2.php?
echo'
page 2';?

// 如果客户端禁用cookie?
echo'
page 2';?
/*?
默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session?
对应的cookie已经存在,那么SID将为(未定义)空*/?
?>?

// page2.php?
session_start();?
print$_SESSION['animal']; // 打印出单个session?
var_dump($_SESSION); // 打印出page1.php传过来的session值?
?>?



2.3 使用session函数控制页面缓存.?
很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了.?

使用session_cache_limiter('private');可以控制页面客户端缓存,必须在session_start()之前调用.?
更多参数见http://blog.chinaunix.net/u/27731/showart.php?id=258087的客户端缓存控制.?
控制客户端缓存时间用session_cache_expire(int);单位(s).也要在session_start()前调用.?

这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存.?

2.4 删除session?

要三步实现.?

session_destroy(); // 第一步: 删除服务器端session文件,这使用setcookie(session_name(),'',time()-3600); // 第二步: 删除实际的session:?
$_SESSION= array(); // 第三步: 删除$_SESSION全局变量数组?>?

2.5 session在PHP大型web应用中的使用对于访问量大的站点,用默认的session存贮方式并不适合,目前最优的方法是用数据库存取session.这时,函数bool session_set_save_handler( callbackopen, callbackclose, callbackread, callbackwrite, callbackdestroy, callbackgc )就是提供给我们解决这个问题的方案.?
该函数使用的6个函数如下:?

1. bool open() 用来打开会话存储机制,?

2. bool close() 关闭会话存储操作.?

3. mixde read() 从存储中装在session数据时使用这个函数4. bool write() 将给定session ID的所有数据写到存储中5. bool destroy() 破坏与指定的会话ID相关联的数据6. bool gc() 对存储系统中的数据进行垃圾收集例子见php手册session_set_save_handler() 函数.?
如果用类来处理,用session_set_save_handler(?
array('className','open'),?
array('className','close'),?
array('className','read'),?
array('className','write'),?
array('className','destroy'),?
array('className','gc'),?
)?
调用className类中的6个静态方法.className可以换对象就不用调用静态方法,但是用静态成员不用生成对象,性能更好.?

2.6 常用session函数:?

bool session_start(void); 初始化session?
bool session_destroy(void): 删除服务器端session关联文件。stringsession_id() 当前session的id?
stringsession_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。arraysession_get_cookie_params() 与这个session相关联的session的细节.?
stringsession_cache_limiter() 控制使用session的页面的客户端缓存ini session_cache_expire() 控制客户端缓存时间bool session_destroy() 删除服务器端保存session信息的文件void session_set_cookie_params( int lifetime [, stringpath [, stringdomain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节bool session_set_save_handler( callbackopen, callbackclose, callbackread, callbackwrite, callbackdestroy, callbackgc )定义处理session的函数,(不是使用默认的方式)?
bool session_regenerate_id([bool delete_old_session]) 分配新的session id?


2.7 session安全问题攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.?
因此,我们主要解决的思路是效验session ID的有效性.?


if(!isset($_SESSION['user_agent'])){?
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];?
}?

/* 如果用户session ID是伪造*/elseif($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {?
session_regenerate_id();?
}?
?>?


2.8 Session通过cookie传递和通过SID传递的不同:?
在php5.2.1的session的默认配置的情况下,当生成session的同时,服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说,写入cookie和抛出SID是等价的.),当$_COOKIE['PHPSESSID']存在以后,将不再写入cookie,也不再生成超级全局变量SID,此时,SID将是空的.?


2.9 session使用实例
/**?
* 效验session的合法性*?
*/functionsessionVerify() {?
if(!isset($_SESSION['user_agent'])){?
$_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']?
.$_SERVER['HTTP_USER_AGENT']);?
}?
/* 如果用户session ID是伪造,则重新分配session ID */elseif($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']?
. $_SERVER['HTTP_USER_AGENT'])) {?
session_regenerate_id();?
}?
}?

/**?
* 销毁session?
* 三步完美实现,不可漏*?
*/functionsessionDestroy() {?
session_destroy();?
setcookie(session_name(),'',time()-3600);?
$_SESSION= array();?
}?
?>?

注明:?

session 出现头信息已经发出的原因与cookie一样.?
在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.?
session的保存数据的时候,是通过系列化$_SESSION数组来存贮,所以有系列化所拥有的问题,可能有特殊字符的值要用base64_encode函数编码,读取的时候再用base64_decode解码。

?

来源:http://www.jb51.net/article/22945.htm

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1269
29
C# 教程
1249
24
PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python:解释了不同的范例 PHP和Python:解释了不同的范例 Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

See all articles