PHP会话未保存

时间:2016-08-31 11:34:42

标签: php session cookies

我有一个相当奇怪的问题;有三个页面正在使用这个cookie - 一个设置$_SESSION = 0(另一个Stack文章表明我的问题可能与PHP有关时间有关,所以'预创建会议,然后写它可能有帮助),另一个文件启动会话,将会话cookie更改为包含一些有用数据的数组,并据称保存它。只有,在这个文件中,会话永远不会真正写入磁盘......在第三页上,我将尝试访问cookie并获得' 0'的输出。 (第一页)。

我花了很多时间调试这个并检查过:

  1. 正确使用了session_startsession_write_close
  2. PHP.ini设置正确,具有可写存储路径(/ tmp)
  3. PHP实际上正在使用此存储路径!
  4. 我还坐在那里比较浏览器和服务器上的cookie ID,以便在会话进行和未创建时进行计算。
  5. 我的代码中没有发现问题,并且由于其他网页能够正确使用会话(第1页和第3页),因此只有第2页出现问题。

    这是我从第二页开始的调试输出,显示我尝试编写的数组以及PHP似乎不知道会话ID是什么的事实,但是当我调用{{1}时没有错误}?

    session_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(); ?> 的输出是

      

    BOOL(真)

    如果刷新页面,var_dump(session_start());的输出会发生变化(会话ID更改)。

    感谢您的帮助 - 我希望我不是傻瓜。我已经做了很多努力来调试这个。

    编辑:

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

    系统:Ubuntu Server 16.04 PHP7 Apache2

2 个答案:

答案 0 :(得分:0)

非常感谢 Ryan Vincent ,他们通过聊天帮助解决了这个问题。

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

答案 1 :(得分:-2)

session_start();

应位于脚本的顶部,如果顶部包含的文件不包含session_start(),则应位于使用会话变量的每个页面的顶部。