【发布时间】:2016-08-31 11:34:42
【问题描述】:
我有一个很奇怪的问题;有三个页面正在使用这个 cookie - 一个设置 $_SESSION = 0 (正如另一篇 Stack 文章所暗示的,我的问题可能与 PHP 在时间上遇到困难有关,因此“预先创建”会话,然后写入它可能会有所帮助),另一个文件启动会话,将会话 cookie 更改为一个包含一些有用数据的数组,并应该保存它。只是,在这个文件中,会话永远不会真正写入磁盘...在第三页上,我将尝试访问 cookie 并获得“0”的输出(第一页)。
我花了很多时间调试这个并检查过:
-
session_start和session_write_close使用得当。 - PHP.ini 设置正确,具有可写存储路径 (/tmp)
- 那个PHP其实就是在使用这个存储路径!
- 我还坐在那里比较了浏览器和服务器上的 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 会话。您可能有一个简单的逻辑错误阻止任何会话处理工作。这就是为什么我建议回归基础。