我有一个问题,我在2页之间丢失PHP会话。
session_start()包含在名为session-inc.php的文件中,每个页面都需要设置会话。这适用于站点上的所有页面,除了一个特定页面member-profile.php。访问此页面时,将设置并使用具有不同ID(相同会话名称)的新会话。
更多细节:
- 会话名称是手动设置的
- 所有页面都位于同一域名下的同一服务器上
- 如果我在member-profile.php文件中的include('session-inc.php')上面添加了一个额外的session_start(),则会话被正确地转移
- 我已尝试在.htaccess中设置session_cookie_domain和session.session_name,这适用于此域,但它已停止将会话传递到付款域
- 我们用php 5.2.5运行apache 2.2.6
将session_start()放在member-profile.php文件中的include('session-inc.php')之上是对这个问题的快速而肮脏的修复,但我想知道是否有人知道为什么会发生这种情况。
干杯
将
根据PHP文档, session_start
必须在将任何输出发送回浏览器之前调用 - 此页面是否有一个流氓CR / LF,Unicode字节顺序标记或类似的导致输出的输出 include('session-inc.php')
?
在将遗留站点从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更改
我刚遇到这个问题。有趣的是,通过浏览 http://127.0.0.1
代替 http://localhost
帮助过我。
发现了这个问题
在第二个域的主包含文件的开头有一个字节顺序标记。如ken所述,在会话开始之前没有任何输出,它没有正确设置会话。
发现问题是在文件开头输出了一个字节顺序标记(BOM)。摆脱它,它解决了会话问题。
解:
session.auto_start = on
在文件中:php.ini
它解决了在页面重新加载(页面刷新/更改页面)上重新生成会话ID的问题。
这个问题出现在更新CPanel(包括Multi PHP)之后,即使php版本保持不变。
PHP.ini文件根本没有该变量。
进入Cpanel - > MultiPHP INI编辑器 - >编辑模式(非基本,基本没有这个设置)并添加了该行。按保存。
提示/何时使用此解决方案:
要确定这是否是问题,请在index.php文件的最开头和最后添加一行以检查会话ID。使用功能:
SESSION_ID();
浏览页面/重新加载页面。如果session_id值发生更改,则问题不在您的代码中,此解决方案应解决您的问题(会话在代码之外丢失)。
我还尝试验证在Web服务器上保存会话的可用性(session.save_path),但是,即使它是一个主角,也不是这样。
我想这是Cpanel的一个“功能”,它会经常发生MULTIPHP UPDATE。
我有这个问题,原因是PHP在第一个100之后忽略了所有的cookie 问这个问题试图找出原因,但到目前为止还没有人知道它。浏览器正在发送PHPSESSID *,但由于它是第110个cookie,PHP忽略了它。
要弄清楚这个问题是否会对您产生影响,请使用浏览器的开发工具查看浏览器随请求发送的cookie,并将该列表与PHP中的$ _COOKIE数组进行比较。它们应该是一样的。但是,如果浏览器正在发送PHPSESSID *,并且$ _COOKIE中没有PHPSESSID *,则可以解释为什么会话无法正常工作。
我没有让我的网站使用如此多的cookie解决了这个问题,这无论如何都是很好的做法。
* PHPSESSID是默认会话名称。您的网站可能使用其他名称。