【问题标题】:PHP Session not being savedPHP 会话未保存
【发布时间】:2016-08-31 11:34:42
【问题描述】:

我有一个很奇怪的问题;有三个页面正在使用这个 cookie - 一个设置 $_SESSION = 0 (正如另一篇 Stack 文章所暗示的,我的问题可能与 PHP 在时间上遇到困难有关,因此“预先创建”会话,然后写入它可能会有所帮助),另一个文件启动会话,将会话 cookie 更改为一个包含一些有用数据的数组,并应该保存它。只是,在这个文件中,会话永远不会真正写入磁盘...在第三页上,我将尝试访问 cookie 并获得“0”的输出(第一页)。

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

  1. session_startsession_write_close 使用得当。
  2. PHP.ini 设置正确,具有可写存储路径 (/tmp)
  3. 那个PHP其实就是在使用这个存储路径!
  4. 我还坐在那里比较了浏览器和服务器上的 cookie ID,以确定何时创建和未创建会话。

我的代码中没有发现问题,并且由于其他页面能够正确使用会话(第 1 页和第 3 页),因此只有第 2 页存在问题。

这是我在第二页的调试输出,显示了我尝试编写的数组以及 PHP 似乎不知道会话 ID 是什么的事实,但是当我调用 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();
?>

var_dump(session_start()); 的输出是

布尔(真)

如果您刷新页面,$_COOKIE 的输出会发生变化(因为会话 ID 会发生变化)。

感谢您的帮助 - 我希望我不是愚蠢的。我为此付出了很多努力。

编辑:

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

系统:Ubuntu Server 16.04 PHP7 Apache2

【问题讨论】:

  • 请查看此链接,它可能会有所帮助:stackoverflow.com/questions/19692157/…
  • 不太确定,但$_SESSION 不是会话数据数组!? $_SESSION = 0 对我个人来说没有任何意义。尝试使用$_SESSION["id"] = 0;(或任何您想要的)并以您对任何其他数组的方式访问它。我重复一遍,不确定并且从未尝试将某些东西直接分配给$_SESSION 变量。逻辑上说,如果你将 $_SESSION 变量设置为某个变量,它会删除该变量的所有其他数组元素。
  • @Wh1T3h4Ck5 我会看一下,在我进行更改之前它不起作用(更多用于调试)并且因为它正在正确设置变量我不确定是否有有问题吗?
  • var_dump($_COOKIE); 显示什么?
  • 如果您愿意,请保留它 - 但是,我会确保代码适用于标准 PHP 会话。您可能有一个简单的逻辑错误阻止任何会话处理工作。这就是为什么我建议回归基础。

标签: php session cookies


【解决方案1】:

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

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

【讨论】:

  • 您能详细说明一下吗?您的代码在我能发现的任何地方都没有使用文件路径:-?
  • 当然。实际上,问题在于用于通过包含加载此文件的文件路径。我会更新的。
  • 失败包括触发警告。问题可能是您的 PHP 安装在系统范围内禁用了错误报告,并且您在 inside 包含的文件中启用了它。这说明了在您在这里提问时提供实际代码的重要性 :) 无论如何,很高兴您解决了问题。
  • 是的,确实如此。我确实尝试包含代码,但考虑到使用相对目录的文件是 500 行,而且我不明白这可能是什么问题,我想我会为你省去麻烦 :) 哈!
【解决方案2】:
session_start();

应该在脚本的顶部,并且如果顶部包含的文件不包含session_start(),它应该在使用会话变量的每个页面的顶部。

【讨论】:

  • 情况就是这样 - 事实上,这是我检查的第一件事(并且在问题中说明)
  • 我不需要“在上面”。如果它位于发送 HTTP 标头之前以及(当然)在使用会话数据之前就足够了。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2012-12-23
  • 2014-08-02
  • 2012-09-06
  • 2012-05-29
  • 2014-10-12
相关资源
最近更新 更多