未保存PHP会话

未保存PHP会话,php,session,cookies,Php,Session,Cookies,我有一个相当奇怪的问题;有三个页面正在使用此cookie-一个页面设置$\u SESSION=0(另一篇Stack文章建议我的问题可能与PHP在计时方面有困难有关,因此“预创建”会话,然后写入会话可能会有所帮助),另一个文件启动会话,将会话cookie更改为一个数组,其中包含一些有用的数据,并假定将其保存。只是,在此文件中,会话永远不会写入磁盘。。。在第三页,我将尝试访问cookie并获得“0”(第一页)的输出 我已经花了很多时间调试这个,并检查了: 正在适当地使用session\u start

我有一个相当奇怪的问题;有三个页面正在使用此cookie-一个页面设置
$\u SESSION=0
(另一篇Stack文章建议我的问题可能与PHP在计时方面有困难有关,因此“预创建”会话,然后写入会话可能会有所帮助),另一个文件启动会话,将会话cookie更改为一个数组,其中包含一些有用的数据,并假定将其保存。只是,在此文件中,会话永远不会写入磁盘。。。在第三页,我将尝试访问cookie并获得“0”(第一页)的输出

我已经花了很多时间调试这个,并检查了:

  • 正在适当地使用
    session\u start
    session\u write\u close
  • PHP.ini设置正确,具有可写存储路径(/tmp)
  • PHP实际上正在使用这个存储路径
  • 我还坐在那里比较了浏览器和服务器上的cookie ID,以确定会话的创建时间和未创建时间 我在我的代码中没有看到问题,因为其他页面能够正确使用会话(第1页和第3页),所以只有第2页有问题

    这是我在第二页的调试输出,显示了我试图编写的数组,加上PHP似乎不知道会话ID是什么,但调用
    session\u start
    时没有错误

    bool(true)
    session id: 
    session file: /tmp/sess_  does not existarray(3) {
      ["user"]=>
      string(5) "kevin"
      ["time"]=>
      int(1472646292)
      ["ip"]=>
      string(13) "178.62.20.247"
    }
    array(1) {
      ["oscar"]=>
      string(26) "9h8c8fgkscitc7l3m7t18f37u2"
    }
    
    和第二页的相关代码:

    <?php
    //error reporting
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    //session starts
    session_name("oscar");
    var_dump(session_start());
    
    session_regenerate_id();
    
    if (! is_writable(session_save_path())) { throw new \Exception( session_save_path() . ' NOT WRITABLE!'); }
    
    
    
    
    $_SESSION['user'] = $_POST['username'];
    $_SESSION['time'] = time();
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
    
    echo '<pre>';
    echo 'session id: ', session_id(), "\n";
    
    $sessionfile = ini_get('session.save_path') . '/' . 'sess_'.session_id();
    echo 'session file: ', $sessionfile, ' ';
    if ( file_exists($sessionfile) ) {
        echo 'size: ', filesize($sessionfile), "\n";
        echo '# ', file_get_contents($sessionfile), ' #';
    }
    else {
        echo ' does not exist';
    }
    
    var_dump($_SESSION);
    var_dump($_COOKIE);
    echo "</pre>\n";
    
    session_write_close();
    
    exit();
    ?>
    
    
    
    var_dump(session_start())的输出

    布尔(真)

    如果刷新页面,
    $\u COOKIE
    的输出会发生变化(会话ID发生变化)

    谢谢你的帮助-我希望我没有愚蠢。我做了很多努力来调试这个

    编辑:

    现在,脚本在文件系统中的位置似乎存在问题。 所有文件都通过一个
    index.php
    加载-不更新会话(不工作)的文件位于
    api/filename.php
    ,而工作的文件位于
    。/server/includes/admin/filename.php
    。(注意,这些路径是相对于
    index.php

    系统:Ubuntu服务器16.04 PHP7 Apache2


    应该位于脚本的顶部,并且如果顶部包含的文件不包含
    会话_start()

    非常感谢帮助解决此聊天问题的Ryan Vincent,它应该位于使用会话变量的每个页面的顶部


    它源于实际脚本的加载方式——使用目录更高一级文件的相对路径。不幸的是,这导致了一些问题,但没有产生任何错误。通过转换到绝对路径:
    DIR。api/filename.php
    我们设法解决了这个问题

    请检查此链接,它可能会有所帮助:不太确定,但会话不是会话数据数组吗
    $\u SESSION=0
    对我个人来说没有任何意义。尝试使用
    $\u会话[“id”]=0(或任何您想要的)并以使用任何其他数组的方式访问它。我重复了一遍,不确定,也从未尝试过将某些内容直接分配给
    $\u SESSION
    变量。逻辑上说,如果将$\u SESSION变量设置为某个值,它会删除该变量的所有其他数组元素。@Wh1T3h4Ck5我会看一看,在我进行更改之前,它不起作用(主要是为了调试),由于它正确设置了变量,我不确定是否存在问题。
    var\u dump($\u COOKIE)有什么作用显示?如果您愿意,请保留该选项-但是,我会确保代码与标准PHP会话一起工作。您可能有一个简单的逻辑错误,阻止任何会话处理工作。这就是为什么我建议回到基础上来。事实上,这是我检查的第一件事(并且在问题中说明了),我不需要“在上面”。如果它位于发送HTTP头之前,并且(当然)在使用会话数据之前,就足够了。您能详细说明一下吗?您的代码没有在我能发现的任何地方使用文件路径:-?当然。实际上,问题出在用于通过包含加载此文件的文件路径上。我将更新。失败包括触发器警告。问题可能是您的PHP安装在系统范围内禁用了错误报告功能,并且您正在包含的文件中启用它。这说明了当你在这里提问时提供实际代码的重要性:)不管怎样,很高兴你把问题解决了。是的,这是真的。我确实尝试过包含代码,但考虑到使用相对目录的文件有500行,我不知道这是怎么回事,我想我可以帮你省去麻烦:)哈哈!
    
    session_start();