PHP中为啥$_SESSION语句同时用时,临时文件里有一个是空的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中为啥$_SESSION语句同时用时,临时文件里有一个是空的?相关的知识,希望对你有一定的参考价值。

我同时用力$_SESSION["admin"] = true; session_id($sessionID); 在临时文件夹中生成了两个SESS文件,sess_5be514313a8238726c7b494ac88bf959和sess_a,但是sess_5be514313a8238726c7b494ac88bf959是空的没有东西,sess_a是admin|b:1。为什么?求指导?怎么解决?

参考技术A 以下是关于session_id 函数使用的说明:

如果不带参数使用session_id(),将返回当前的Session ID,如果带参数指定ID,将替换当前的session id。session_id() 需要在session_start()调用之前进行设置。根据session handler的不同,并不是所有的字符都可以使用,比如,文件 session handler 仅允许字符a-z A-Z 0-9 , (逗号) 和 - (减号)。
  注意:当使用seesion cookies, 当session_start() 被调用时,指定的session_id(id)将总是发送新的cookie。
参考技术B 注意格式那<?php session_start();?>一定要放在整个代码区的最前面!本回答被提问者采纳

为啥 PHP $_SESSION 变量在 header() 方法中使用时不起作用?

【中文标题】为啥 PHP $_SESSION 变量在 header() 方法中使用时不起作用?【英文标题】:Why PHP $_SESSION variable not working when being used in header() method?为什么 PHP $_SESSION 变量在 header() 方法中使用时不起作用? 【发布时间】:2021-07-25 10:37:00 【问题描述】:

最近,我在开发 PHP 脚本时遇到了一个奇怪的对比。 关键是,我想使用全局 $_SESSION 变量将 HTTP 响应状态代码发送到另一个页面。然后在目标页面上,我将使用header() 方法将这个HTTP 响应状态码发送到浏览器。 HTTP 响应状态码是什么并不重要。例如,我们在这里考虑 “422 Unprocessable Entity”。 所以,我们很容易编写我们的脚本:

file1.php:(源文件)

<?php
session_start();
$_SESSION['xyz'] = "422 Unprocessable Entity";
header('Location: file2.php');

file2.php:(目标文件)

<?php
session_start();
header("HTTP/1.1 " . $_SESSION['xyz']);
var_dump($_SESSION['xyz']);
unset($_SESSION['xyz']);

输入网址example.com/file1.php后,我们将毫无问题地转移到目的地(example.com/file2.php)。在浏览器控制台(网络选项卡)中,我们将看到 422 错误。没有创建error_log文件,页面的输出内容为:

string(24) "422 Unprocessable Entity"

一切看起来都不错。 但问题是,如果你使用https://httpstatus.io/检查发送的header的正确性,除了在你的服务器上创建一个error_log文件,你会遇到如下输出:

这很令人困惑。而且error_log文件的内容是:

[02-May-2021 22:21:13 UTC] PHP Warning:  Undefined array key "xyz" in /www_root/file2.php on line 3
[02-May-2021 22:21:13 UTC] PHP Warning:  Undefined array key "xyz" in /www_root/file2.php on line 4

表示变量$_SESSION['xyz']没有设置。

我尝试通过修改file2.php来调试脚本:

<?php
session_start();
header("HTTP/1.1 422 Unprocessable Entity");
var_dump($_SESSION['xyz']);
unset($_SESSION['xyz']);

然后,问题就莫名其妙地解决了:

现在我想问一个问题,我的方法(将HTTP响应状态码传递到另一个页面)的基础是否正确?如果是这样,为什么我会收到错误消息?在接收$_SESSION 变量之前,header() 方法是否在 PHP 中执行?这两个函数的执行时间表是什么?感谢您的帮助。

【问题讨论】:

【参考方案1】:

我怀疑网站检查出了点问题。

具体来说,如果服务器确实遵循了重定向,但没有设置会话 cookie 标头,您所感叹的行为是我所期望的。如果是这种情况,那么file2.php 会得到一个空会话。

尝试在 file2.php 中输出session_id() 并查看它是否在 file1 和 file2 之间发生变化(如果 cookie 传输正确,它不应该发生变化)。

或者可以在该位置发送一个 GET 变量,例如 id=(session id)。然后在 file2.php 中验证您是否获得了 session_id() 的 id。如果不是,请连接到“好”会话 ID(请参阅 session_id 手册页)。看看 then 你是否看到了 xyz 键。很有可能你会的。

【讨论】:

您的怀疑可能是正确的。我认为我们的脚本完全没有问题。问题是“httpstatus.io”在从 file1.php 转换到 file2.php(302 重定向)期间没有保留和传输 $_SESSION 变量。现在在这种情况下,您认为防止error_log被创建的最简单方法是什么? 只需在session_start()后添加if(isset($_SESSION['xyz'])),error_log就不会再创建了。

以上是关于PHP中为啥$_SESSION语句同时用时,临时文件里有一个是空的?的主要内容,如果未能解决你的问题,请参考以下文章

部分删除/销毁 $_SESSION 数据? PHP

为啥 PHP $_SESSION 变量在 header() 方法中使用时不起作用?

PHP $_SESSION['key'] 被输入按钮值覆盖。为啥?

PHP 为啥 $_SESSION 变量拒绝在浏览器关闭时取消设置?

PHP文件上传

PHP上传大文件解决办法