0

0

PHP session与cookie_PHP教程

php中文网

php中文网

发布时间:2016-07-14 10:10:15

|

1288人浏览过

|

来源于php中文网

原创

php session原理

session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议,服务器响应完后就失去了与浏览器的联系,cookie引入浏览器,使得数据跨越页面交换。

首先客户端和服务器端建立一一联系,每个客户端都有一个唯一标识,这样服务器才能识别出来。建议唯一标识的方法有两种:cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫”PHPSESSID”的cookie(可以通过php.ini修改session.name值指定),如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器(修改php.ini中session.use_trans_sid等参数)。

客户端将session id传递到服务器,服务器根据session id找到对应的文件,读取的时候对文件内容进行反序列化就得到session的值,保存的时候先序列化再写入。

事实就是这样,如果服务器不支持session或者你想自定义session,完全可以DIY,通过PHP的uniqid生成永不重复的session id,然后找个地方存储session的内容即可,还可以把session存储在MySQL数据库中。

立即学习PHP免费学习笔记(深入)”;

所谓的session其实就是客户端一个session id,服务器端一个session file,新建session时,告诉服务器要生成一个cookie以及准备好session文件,要不然你的session内容怎么存;读取session时告诉服务器,赶紧根据session id把session文件反序列化。

session影响系统性能

session在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时,PHP支持session目录hash,我们可以通过修改php.ini中session.save_path =“2;/path/to/session/dir”,那么session将存储在两级子目录中,每个目录有16个子目录[0~f],不过好像PHPsession不支持创建目录,你需要事先把那么些目录创建好 。

还有一个问题就是小文件的效率问题,一般我们的session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率肯定会很差。可以通过缓存memcache和mysql数据库提供效率。

session的同步

前端可能有很多台服务器,用户在A服务器上登录了,种下了session信息,然后访问网站的某些页面没准跳到B服务器上去了,如果这个时候B服务器上没有session信息又没有做特殊处理,可能就会出问题了。

session同步有很多种,如果你是存储在memcached或者MySQL中,那就很容易了,指定到同样的位置即可,如果是文件形式的,你可以用NFS统一存储。

(NFS是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。)

还有一种方式是通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无session,如果有当然没问题,如果没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。这种方法其实很有用,如果网站有很多个子频道,服务器也不在一个机房,session没办法同步又想做统一登录那就太有用了。

当然还有一种方法就是在负载均衡那一层保持会话,把访问者绑定在某个服务器上,他的所有访问都在那个服务器上就不需要session同步了。


session_start();

if(isset($_SESSION['test_sess'])){

     $_SESSION['test_sess']++;

}else{

     $_SESSION['test_sess'] = 0;

}

echo$_SESSION['test_sess'];

?>;

第一次请求服务器:

GET/test.php HTTP/1.1

Accept:*/*

Referer:http://localhost/

Accept-Language:zh-cn

Accept-Encoding:gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)

Host:localhost

Connection:Keep-Alive

服务器第一次返回:

HTTP/1.1200 OK

《PHP程序设计》第二版
《PHP程序设计》第二版

本书图文并茂,详细讲解了使用LAMP(PHP)脚本语言开发动态Web程序的方法,如架设WAMP平台,安装与配置开源Moodle平台,PHP程序设计技术,开发用户注册与验证模块,架设LAMP平台。 本书适合计算机及其相关专业本、专科学生作为学习LAMP(PHP)程序设计或动态Web编程的教材使用,也适合对动态Web编程感兴趣的读者自觉使用,对LAMP(PHP)程序设计人员也具有一定的参考价值。

下载

Date:Fri, 26 Aug 2005 07:44:22 GMT

Server:Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2

X-Powered-By:PHP/5.0.4

Set-Cookie:PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/

Expires:Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache,must-revalidate, post-check=0, pre-check=0

Pragma:no-cache

Content-Length:1

Keep-Alive:timeout=15, max=99

Connection:Keep-Alive

Content-Type:text/html; charset=utf-8

Content-Language:Off

第二次请求服务器:

GET/test.php HTTP/1.1

Accept:*/*

Referer:http://localhost/

Accept-Language:zh-cn

Accept-Encoding:gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)

Host:localhost

Connection:Keep-Alive

Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3

服务器第二次返回:

HTTP/1.1200 OK

Date:Fri, 26 Aug 2005 07:44:23 GMT

Server:Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2

X-Powered-By:PHP/5.0.4

Set-Cookie:PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/

Expires:Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache,must-revalidate, post-check=0, pre-check=0

Pragma:no-cache

Content-Length:1

Keep-Alive:timeout=15, max=98

Connection:Keep-Alive

Content-Type:text/html; charset=utf-8

Content-Language:Off

仔细对比这些输出,第二次请求比第一次请求多出来的就是:

Cookie:PHPSESSID=bmmc3mfc94ncdr15ujitjogma3

这个header将会向服务器发送一个cookie信息,告诉服务器我有一个cookie,名字叫PHPSESSID,内容是bmmc3mfc94ncdr15ujitjogma3。

这个cookie是怎么来的呢?看第一次服务器返回的信息里边有:

Set-Cookie:PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/

这是服务器向客户端浏览器写一个cookie,名字是PHPSESSID,值是bmmc3mfc94ncdr15ujitjogma3,这个值实际就是所谓的session_id。

继续看第二次向服务器发出的请求,仍然向服务器发送了PHPSESSID这个cookie

可以得到以下结论:

1、只要使用了session,就会通过cookie的方式向客户端浏览器发送session

2、每次向服务器发出请求的时候,本地浏览器会把cookie附带在请求信息中

COOKIE

    cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。

PHP在http 协议的头信息里发送cookie,因此setcookie()函数必须在其它信息被输出到浏览器前调用。

原理.

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 fromsomewhere; path=/

浏览器将在客户端的磁盘上创建一个cookie 文件。

下面的同样的效果:

setcookie('TestCookie','something   from somewhere','/');

header('Set-Cookie:TestCookie=something from somewhere; path=/')

常见问题解决:

1) 用 setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格。

2) $_COOKIE 受magic_quotes_gpc 影响,可能自动转义。

3) 使用的时候,有必要测试用户是否支持cookie。

下面以用户登录为例分析session和cookie

HTTP协议是一种无状态协议,服务器响应完用户的请求,就失去了与浏览器的联系,PHP是如何实现session的。

用户第一次访问服务器时,因为没有session信息,需要登录验证,用户通过表单把用户名,密码,验证码等信息提交给服务器,服务器在验证用户的合法性之前先对数据进行预处理。通过到数据库验证,用户是合法的,这个时候服务器会给浏览器信息中包含Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3;这样的信息,这样浏览器会把信息写到本地文件中,其中PHPSESSID为唯一标识符。同时服务器也会在指定的文件把序列化的session信息保存在文件中。当用户再次请求时,浏览器会把对应cookie中的PHPSESSID也发送给服务器,服务器得到PHPSESSID,会到session文件中验证,如果验证成功,就直接登录。从而类似的可以实现数据在不同用户页面之前的传递。session中的值是key-value。

session影响系统性能

session在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时,PHP支持session目录hash,我们可以通过修改php.ini中session.save_path =“2;/path/to/session/dir”,那么session将存储在两级子目录中,每个目录有16个子目录[0~f],不过好像PHPsession不支持创建目录,你需要事先把那么些目录创建好 。

还有一个问题就是小文件的效率问题,一般我们的session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率肯定会很差。可以通过缓存memcache和mysql数据库提供效率。

session的同步

前端可能有很多台服务器,用户在A服务器上登录了,种下了session信息,然后访问网站的某些页面没准跳到B服务器上去了,如果这个时候B服务器上没有session信息又没有做特殊处理,可能就会出问题了。

session同步有很多种,如果你是存储在memcached或者MySQL中,那就很容易了,指定到同样的位置即可,如果是文件形式的,你可以用NFS统一存储。

(NFS是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。)

还有一种方式是通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无session,如果有当然没问题,如果没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。这种方法其实很有用,如果网站有很多个子频道,服务器也不在一个机房,session没办法同步又想做统一登录那就太有用了。

还有一种方法就是在负载均衡那一层保持会话,把访问者绑定在某个服务器上,其他所有访问都在那个服务器上就不需要

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477521.htmlTechArticlephp session原理 session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议,服务器...

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

18

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

15

2026.02.25

Python数据处理流水线与ETL工程实战
Python数据处理流水线与ETL工程实战

本专题聚焦 Python 在数据工程场景下的实际应用,系统讲解 ETL 流程设计、数据抽取与清洗、批处理与增量处理方案,以及数据质量校验与异常处理机制。通过构建完整的数据处理流水线案例,帮助开发者掌握数据工程中的性能优化思路与工程化规范,为后续数据分析与机器学习提供稳定可靠的数据基础。

1

2026.02.25

Java领域驱动设计(DDD)与复杂业务建模实战
Java领域驱动设计(DDD)与复杂业务建模实战

本专题围绕 Java 在复杂业务系统中的建模与架构设计展开,深入讲解领域驱动设计(DDD)的核心思想与落地实践。内容涵盖领域划分、聚合根设计、限界上下文、领域事件、贫血模型与充血模型对比,并结合实际业务案例,讲解如何在 Spring 体系中实现可演进的领域模型架构,帮助开发者应对复杂业务带来的系统演化挑战。

1

2026.02.25

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

18

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

9

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

6

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

5

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号