我有一个相当奇怪的问题;有三个页面正在使用这个cookie - 一个设置$_SESSION = 0
(另一个Stack文章表明我的问题可能与PHP有关时间有关,所以'预创建会议,然后写它可能有帮助),另一个文件启动会话,将会话cookie更改为包含一些有用数据的数组,并据称保存它。只有,在这个文件中,会话永远不会真正写入磁盘......在第三页上,我将尝试访问cookie并获得' 0'的输出。 (第一页)。
我花了很多时间调试这个并检查过:
session_start
和session_write_close
。 我的代码中没有发现问题,并且由于其他网页能够正确使用会话(第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
答案 0 :(得分:0)
非常感谢 Ryan Vincent ,他们通过聊天帮助解决了这个问题。
它源于实际脚本的加载方式 - 使用来自目录上方文件的相对路径。不幸的是,这导致了PHP的一些问题,但没有产生任何错误。通过转换到绝对路径:DIR . api/filename.php
我们设法解决了问题。
答案 1 :(得分:-2)
session_start();
应位于脚本的顶部,如果顶部包含的文件不包含session_start()
,则应位于使用会话变量的每个页面的顶部。