PHP 即使在同一页面上,会话变量也不会更新

PHP Session Variables not updating even on same page

我想从我的网页写入(通过 ajax 异步)到 SQL table,使用生成的值作为唯一键。稍后(可能是 1 分钟或 1 天,但在同一浏览器会话中)从另一个页面,我希望能够更新该 SQL 记录。我可以在 url 中传递键值,但更喜欢使用会话变量。为了避免另一个网页破坏会话的可能性,我尝试使用自定义 cookie(不是 PHPSESSID),但会话变量没有更新。

为了简化,我从 ajax 和 运行 直接从我的浏览器中取出了代码。没有错误或消息。

下面是两段代码:page1.php


    <?php
    if(isset($_COOKIE["gcpp_imp"])){$impressionId=$_COOKIE["gcpp_imp"];}
    else{$impressionId="Imp".substr(microtime(),11,11).substr(microtime(),1,7);
    setcookie("gcpp_imp", $impressionId, 0, "/");}
    session_name("gcpp_imp");
    session_id($impressionId);
    session_start();
    $_SESSION["Test"] = "Hello";
    if(isset($_SESSION["Number"])){
        $_SESSION["Number"] = $_SESSION["Number"]+1;
    }
    else{
        $_SESSION["Number"] = 1;
    }
    echo "PAGE 1<br>";
    echo "session_save_path = ".session_save_path()."<br>";
    if (is_writable(session_save_path())) {
        echo "Session path '".session_save_path()."' is writable for PHP!<br>"; 
    }
    else {
        echo "Session path '".session_save_path()."' is not writable for PHP!<br>"; 
    }
    echo "session_name = ".session_name()."<br>";
    echo "session_id = ".session_id()."<br>";
    echo "session_status = ".session_status()."<br>";
    echo "session_Test = ".$_SESSION["Test"]."<br>";
    echo "session_Number = ".$_SESSION["Number"]."<br>";
    ?>

和page2.php


    <?php
    session_name("gcpp_imp");
    session_id($_COOKIE["gcpp_imp"]);
    session_start();
    echo "PAGE 2<br>";
    echo "session_save_path = ".session_save_path()."<br>";
    if (is_writable(session_save_path())) {
        echo "Session path '".session_save_path()."' is writable for PHP!<br>"; 
    }
    else {
        echo "Session path '".session_save_path()."' is not writable for PHP!<br>"; 
    }
    echo "session_name = ".session_name()."<br>";
    echo "session_id = ".session_id()."<br>";
    echo "session_status = ".session_status()."<br>";
    echo "session_Test = ".$_SESSION["Test"]."<br>";
    echo "session_Number = ".$_SESSION["Number"]."<br>";
    ?>

来自 page1.php

的输出
PAGE 1
session_save_path = /var/cpanel/php/sessions/ea-php56
Session path '/var/cpanel/php/sessions/ea-php56' is writable for PHP!
session_name = gcpp_imp
session_id = Imp1568485583.309708
session_status = 2
session_Test = Hello
session_Number = 1

来自 page2.php

的输出
PAGE 2
session_save_path = /var/cpanel/php/sessions/ea-php56
Session path '/var/cpanel/php/sessions/ea-php56' is writable for PHP!
session_name = gcpp_imp
session_id = Imp1568485583.309708
session_status = 2
session_Test =
session_Number =

这些页面都是 运行 来自 https,没有子域,来自同一文件夹。我的服务器是 Hostiso 的 VPS 共享主机,运行ning PHP 版本 5.6.40。

phpinfo.php 显示 session.gc_divisor = 0,session.gc_maxlifetime = 2880(我想增加这个)和 session.gc_probability = 0.

当我刷新 page1.php 时,输出保持不变。所以 cookie gcpp_imp 只设置一次,key/session_id $impressionId 只生成一次,我可以在浏览器中看到 cookie 和值。但是 $_SESSION["Number"] 没有在 page1.php 中更新并且会话变量也没有在 page2.php.

中显示

我错过了什么?

改变session_start()的位置; 它应该是任何页面的第一行。

第 1 页

      session_start();   <-----
      session_name("gcpp_imp");
      session_id($impressionId);

第 2 页

       session_start();   <-----
      session_name("gcpp_imp");
      session_id($_COOKIE["gcpp_imp"]);

答案是"the file session handler only allows characters in the range a-z A-Z 0-9 , (comma) and - (minus)!":见https://www.php.net/manual/en/function.session-id.php 我正在用 $impressionId="Imp".substr(microtime(),11,11).substr(microtime(),1,7) 生成我的 session_id() 产生格式为 Imp1568485583.309708 的字符串 一旦我删除了小数点,它就起作用了!

我花了 3 天的时间来解决这个问题,我一发帖就得到了答案。