请教一下,$_SESSION变量是一个用户一份还是整个服务器一份?

来源:4-8 使用session来存储用户的登录信息

金泽城

2017-03-10 16:14

如果是一个服务器保存一份 $_SESSION 变量的话,按本章课程代码所示,当A用户访问时,$_SESSION['uid']和$_SESSION['name']都被记录成A用户的了,在A用户退出系统前,B用户也来访问了,这时这俩参数岂不是又被改写成 B 用户的数据了,如果A用户接着退出了,又要去清理$_SESSION变量,又把B用户的登录信息给清掉了吗?

感觉PHP的并发处理超级混乱,有没有教程专门讲这一块的内容呢?

写回答 关注

4回答

  • YooRen
    2019-12-01 13:53:29

         php在web服务器上运行时使用php-FPM作为和web服务器交流的中间件,在php-FPM中会为每一个请求分配一个work进程,而每个worker进程里都存在一个php解析器,这样就能保证不同访问之间的数据能够进行隔离而不会出现数据混乱的情况。这个是多进程并发php处理的情况。

          而且,session的运行机制是-告诉浏览器我会对请求访问的用户进行标识跟踪,这样浏览器在发送请求的时候就会自动的将所有的cookie值在每次的请求中作为参数发送过去(其实无论服务器上是否开启了session功能都会将该网站的cookie值(未过期的)作为请求的参数发送给服务器)。

             自然在这里面的cookie中, 如果在这次访问中已经开始了session自然也会包括 seesion_id 这个cookie,如果之前服务器没有为这个访问的用户分配相应的session_id 那么在该次请求之后就会分配相应的 seesion_id 告知浏览器(即客户端, 且服务器端设置开启了 session_start),有了session_id 服务器就能够区别不同的访问的用户,从而使用独自的session文件(默认使用文件存储session)。

  • zhaoandlin
    2019-09-04 19:19:06

    session是根据客户端来判断的,不同的客户端会有不同的sessionid,是不同的session对象

  • 梵音音音
    2017-04-29 09:46:47

    session是服务器为不同的客户端(用户)创建的保存数据的session对象,楼主所说的A用户访问B用户的数据不会出现,原因是一个Session定义的全局变量的作用范围,是指这个Session所对应的用户所访问的所有PHP,并不包含其他用户访问的内容。

    另外,session_id是一次请求服务器为其创建一个,但是,请求过后下一次再请求时,服务器会首先检索是否已经存在请求的session_id,有则启用,没有则创建,所以也不能说是一次请求生成一个,不准确。

    还有一点就是,一个用户使用不同的浏览器访问服务器会创建不同的session_id(记不清了,有待验证...)。

  • zBinboy
    2017-03-10 16:28:26

    准确的来说是一个session_id一个,也可说是每个用户一个

    慕圣3571... 回复金泽城

    也可以指定分配id,session_id("指定的id值")。取回的时候可以使用 0 + session_id()转换为int数据类型

    2018-12-22 19:08:16

    共 3 条回复 >

PHP进阶篇

轻松学习PHP中级课程,进行全面了解,用PHP快速开发网站程序

181906 学习 · 2654 问题

查看课程

相似问题