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