繁体   English   中英

首次尝试时未识别PHP cookie和会话值

[英]PHP cookie and session values not recognized on first attempt

好的,这是我的第二次尝试,以新颖,更加孤立和简洁的方式演示问题。 问题与登录系统有关,在该登录系统中,第一次尝试似乎无法保存会话变量。 但是下面是演示错误行为的简化代码:

<?php

session_start();

echo "POST superglobal: <pre>" . print_r($_POST, true) . "</pre><hr/>";
echo "SESSION superglobal: <pre>" . print_r($_SESSION, true) . "</pre><hr/>";
echo "COOKIE superglobal: <pre>" . print_r($_COOKIE, true) . "</pre><hr/>";

$_SESSION['session_var'] = "SESSION VAR AVAILABLE";
setcookie("cookie_var", "COOKIE VAR AVAILABLE");

?>  
<html>
    <body>
        <form action="" name="frmPost" method="POST">
            <input type="submit" name="cmdSubmitPost" value="Submit" />
        </form>
    </body>
</html>

在本地计算机上的本地主机上,此代码将产生以下内容:

初始页面加载后:

POST superglobal:
Array
(
)

SESSION superglobal:
Array
(
)

COOKIE superglobal:
Array
(
)

[Submit]

单击一次Submit后:

POST superglobal:
Array
(
    [cmdSubmitPost] => Submit
)

SESSION superglobal:
Array
(
    [session_var] => SESSION VAR AVAILABLE
)

COOKIE superglobal:
Array
(
    [cookie_var] => COOKIE VAR AVAILABLE
    [PHPSESSID] => hpkpft4hh1tqlm6e3r496bt5j2
)

[Submit]

这正是我的期望和需要。 我还临时在两个独立的免费php托管站点上进行了注册,以进行测试,它们都产生了与上述相同的结果。

但是,在我的主要托管环境Arvixe中,结果有所不同。 像这样:

初始页面加载后:

POST superglobal:
Array
(
)

SESSION superglobal:
Array
(
)

COOKIE superglobal:
Array
(
)

[Submit]

单击一次Submit后:

POST superglobal:
Array
(
    [cmdSubmitPost] => Submit
)

SESSION superglobal:
Array
(
)

COOKIE superglobal:
Array
(
)

[Submit]

单击Submit第二个时间后:

POST superglobal:
Array
(
    [cmdSubmitPost] => Submit
)

SESSION superglobal:
Array
(
    [session_var] => SESSION VAR AVAILABLE
)

COOKIE superglobal:
Array
(
    [cookie_var] => COOKIE VAR AVAILABLE
    [PHPSESSID] => 2k6ldfl2icdtj1k7sq5dc9qmj3
    [VC-NoCache] => 1
    [_asomcnc] => 1
)

[Submit]

我希望在localhost和其他临时免费php托管环境中创建的结果排除相当简单的代码中的任何基本缺陷。

好的,现在开始提问:在Arvixe托管环境中,为什么页面在第一次提交后不能识别cookie和会话值? 我很确定,真正的问题是为什么第一次提交后无法识别cookie值? (这是真正的问题,因为它回答了为什么无法识别会话值的原因……这是因为尚未识别PHPSESSID cookie)。

php.ini值本质上是相同的,但是如果有一些特定的值可能有助于在此处发布,请让我知道哪些值。

另外,我认为该问题的答案将有效解决其他三个stackoverflow问题:

在页面重新加载TWICE之前,不会设置PHP cookie。 这是怎么回事?

php会话变量第一次尝试时未存储,第二次尝试正常

会话变量不是第一次设置

(那里的解决方案都不适合我)

尽管我从未使用过Arvixe ,但在开发过程中已经遇到了几次该问题。 我绝不是专家,但这是我的研究和经验,也是编码错误之外的两个主要原因。

未根据要求立即创建Cookie

刷新页面后,新创建的cookie不会立即可用。 在使用SESSION_ID和Cookie之前,我曾有这种意外的行为。 例如,如果您在一个请求中设置了cookie,则直到服务器的下一个请求(在设置cookie之后的下一次刷新),该cookie才可用。 setcookie()之后立即访问$ _COOKIE

浏览器缓存网页的逻辑和方式也可能很奇怪,我认为这很可能正在这里发生。

PHP会话未设置-通过。 www non-www问题

您说它是在您的Arvixe环境而不是localhost上发生的吗? 单击提交时,您应该检查域(删除或添加www的域)是否正在更改。 如果htaccess没有正确的规则,或者您没有通过ini_set或PHP中的其他配置设置进行设置,则可能会获得两个session_id。 我不能从您的代码中清楚地看出来,但是如果是这种情况,它将解释为什么您仅第二次获得它(因为第一次提交会加载新域并设置session变量和cookie变量)。 您的服务器可能会将www视为新的子域,而不选择共享cookie和session_id,而是创建一个新的子域。 尝试进入Console并执行document.cookie以获取有关其是否正在更改的信息。

允许php会话继承到子域

无关的session命令或其他原因

如果页面上有任何用session_id修饰的PHP命令,例如重新生成它,或者例如:

session_regenerate_id()
session_write_close()

这些命令可能会影响您的会话并导致意外行为。 由于它是特定于案例的,因此最好进一步阅读有关如何传播和处理会话的文档。 除此之外,它可能是缓存,浏览器,标头,会话的位置,陈旧的会话,以前的cookie以及其他相关问题。

如果代码完全相同,则原因是环境。 做一个phpinfo(); 适用于不同的托管环境。 复制结果页面并进行差异比较。 这将显示PHP的主机安装中可能存在的不平等。

没有人能够通过查看您的代码(不完整或其他)来解决托管环境的问题。

感谢大家的投入。 对于以后可能会搜索此答案的任何人,事实证明,问题出在主机/服务器端。

在实际切换主机(不仅需要这个问题)之后,同样的问题将我带到了新主机上。 但是在新主机上,它们的服务器设置包括称为“清漆缓存”的内容,这与客户端浏览器缓存非常不同。 它是服务器端缓存。

据说它可以提高性能……但是,如果您的应用严重依赖实时cookie和经常更改的会话值,那么它真的会搞砸了!

我敢打赌,我在原始帖子中上面链接的那些其他堆栈溢出帖子是由此引起的。

在新的托管环境中,我只是关闭了所有“清漆缓存”,并且一切运行正常。 我怀疑旧主机有这样的服务器端缓存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM