上下文:我打算使用mod_rewrite(首页加载子页面)构建应用程序,但是却无法从前端控制器页面加载session_enabled页面。
问题:问题是我使用session_start()调用twise,PHP页面停止响应。这很奇怪,session_start函数是无害的,它们在不同的页面上调用。
我已将问题缩小到这个样本:
child.php文件:
parent.php文件:
调用parent.php会使浏览器无限加载。只要您对session_start()调用之一进行评论,它就会立即加载。
问题的根源是什么? 我非常需要启用会话的页面。
PS我可以通过包含页面来解决它,但它们依赖于URL参数,我想避免为了某种参数代理而修复它们。
答案 0 :(得分:5)
一旦您不再需要写入会话,您需要致电session_write_close()
。目前,由于您的脚本在整个持续时间内都会打开会话,因此您一次只能运行一个。
来自the manua l:
会话数据通常存储在之后 你的脚本终止没有 需要致电
session_write_close()
, 但是会话数据被锁定 防止并发写入只有一个 脚本可以在任何会话上运行 时间。一起使用框架集时 通过会议,您将体验到 由于这个原因逐帧加载 锁定。你可以减少时间 需要加载所有帧 所有人都尽快结束会议 会话变量的更改已完成。
答案 1 :(得分:1)
在加载子页面之前尝试使用session_write_close()。
答案 2 :(得分:1)
您还可以检查会话是否已经启动,如果不是,则仅启动新会话:
if (!isset($_SESSION)) session_start();
答案 3 :(得分:1)
此外,一次只能使用一个会话。您需要致电session_regenerate_id
function以生成新ID:
if (session_id() != '') {
session_write_close();
}
session_start();
session_regenerate_id();
否则,父母的会话ID也将用于孩子的会话。
答案 4 :(得分:0)
在你的脚本中有两个session_starts()是件坏事。
为什么不在parent.php文件(而不是child.php)上启动会话? 或者只是child.php而不是parent.php
最好有一个页面包含在初始化所有内容的所有其他页面中(SQL连接,会话启动等)。然后将该页面包含在所有其他页面上。