我遇到一个问题,我在2页之间丢失了PHP会话。
session_start()包含在名为session-inc.php的文件中,每个页面都需要设置会话。这适用于站点上的所有页面,除了一个特定页面member-profile.php。访问此页面时,将设置并使用具有不同ID(相同会话名称)的新会话。
更多细节:
将member_start()放在member-profile.php文件中的include('session-inc.php')上面是对这个问题的快速而肮脏的修复,但我想知道是否有人知道为什么会发生这种情况
干杯
威尔
答案 0 :(得分:7)
根据PHP文档,在将任何输出发送回浏览器之前必须调用session_start
- 此页面是否有一个流氓CR / LF,Unicode字节顺序标记或类似的导致输出的输出include('session-inc.php')
?
答案 1 :(得分:3)
在将遗留站点从PHP4迁移到PHP5时,我注意到php.ini配置设置导致php在每次请求时自动启动会话。这是将session_start()
放在每个页面上的替代方法......
有多种方法可以启用此设置:
将以下行放入php.ini:
session.auto_start = on
或将其放入您的apache虚拟站点配置或.htaccess文件中:
<IfModule mod_php5.c>
php_flag session.auto_start on
</IfModule>
它应该在所有页面上提供$ _SESSION更改
答案 2 :(得分:2)
我刚遇到这个问题。有趣的是,通过http://127.0.0.1
而不是http://localhost
进行浏览对我有帮助。
答案 3 :(得分:0)
发现问题
在第二个域的主包含文件的开头有一个字节顺序标记。如ken所述,在会话开始之前没有任何输出,它没有正确设置会话。
答案 4 :(得分:0)
发现问题是在文件开头输出的字节顺序标记(BOM)。摆脱它,它解决了会话问题。
答案 5 :(得分:0)
解: session.auto_start = on 在文件中:php.ini
它解决了在页面重新加载(页面刷新/更改页面)上重新生成会话ID的问题。
CPanel更新后出现问题(包括Multi PHP),即使php版本保持不变。
PHP.ini文件根本没有该变量。 进入Cpanel - &gt; MultiPHP INI编辑器 - &gt;编辑模式(非基本,基本没有此设置)并添加了该行。按保存。
提示/何时使用此解决方案: 要确定是否存在问题,请在index.php文件的最开头和最后添加一行以检查会话ID。使用功能: SESSION_ID(); 浏览页面/重新加载页面。如果session_id值发生更改,则问题不在您的代码中,此解决方案应解决您的问题(会话在代码之外丢失)。
我还尝试验证在Web服务器上保存会话的可用性(session.save_path),但是,即使它是一个潜在客户,也不是这样。 我想这是一个&#34;功能&#34;具有MULTIPHP UPDATE的Cpanel会经常发生。
答案 6 :(得分:0)
我遇到了这个问题,原因是PHP在第一个100之后忽略了所有的cookie。(我asked this question to try to find out why,但到目前为止还没有人知道它)。浏览器正在发送PHPSESSID *,但由于它是第110个cookie,PHP忽略了它。
要确定这个问题是否会对您产生影响,请使用浏览器的开发工具查看浏览器随请求发送的Cookie,并将该列表与PHP中的$ _COOKIE数组进行比较。它们应该是一样的。但是如果浏览器正在发送PHPSESSID *,并且$ _COOKIE中没有PHPSESSID *,则可以解释为什么会话无效。
我通过不让我的网站使用这么多cookie解决了这个问题,这无论如何都是很好的做法。
* PHPSESSID是默认会话名称。您的网站可能使用其他名称。
答案 7 :(得分:0)
要解决每个请求后的session_id更改,请将参数 session.auto_start 和 session.cookie_httponly 更改为php配置文件。
找到用过的php配置文件
php -i | grep "php.ini"
然后打开它,并尝试找到参数session.auto_start。你设置
session.auto_start = 1
session.cookie_httponly = 0
最后重启httpd / apache服务。
答案 8 :(得分:0)
发现了问题
在我的情况下,这是由于“清漆设置”引起的,请检查您的清漆设置。 PHPSESSID,您可以从“涂漆设置”中排除cookie。
答案 9 :(得分:0)
我整天都在Ionic3-to-PHP项目中诊断此问题。 TL; DR-确保您的客户端实际上正在发送会话凭据。
为了帮助任何犯此错误的人,我将分享如何发现问题。 我使用这些工具来诊断客户端和服务器上的会话:
1)将带有phpinfo()的测试文件添加到服务器以查看PHP会话选项。
2)检查PHP代码,以确保在session_start()行之前没有发生任何有意或无意的输出。检查Visual Studio代码的状态栏,以确保PHP文件中没有字节顺序标记(BOM)。
3)查看服务器PHP日志(对我来说在/var/log/nginx/error.log中)。在PHP文件中添加error_log()行以转储session_id()或$ _SESSION数组。
4)使用tcpdump -An 'port 80 or port 443'
查看实际的HTTP请求和答复。 (这就是我发现缺少cookie的地方。)
对于Ionic3数据提供程序,客户端的正确语法为:
var obsHttp = this.http.post(url, body,
{ headers: new HttpHeaders({
'Content-Type':'application/x-www-form-urlencoded'
}),withCredentials: true }).timeout(this.timeoutTime);
通知withCrentials:true
需要在可观察到的obsHttp()上调用订阅以发送请求。