两个session_starts()挂起PHP应用程序

时间:2009-02-26 13:31:46

标签: php file session front-controller

上下文:我打算使用mod_rewrite(首页加载子页面)构建应用程序,但是却无法从前端控制器页面加载session_enabled页面。

问题:问题是我使用session_start()调用twise,PHP页面停止响应。这很奇怪,session_start函数是无害的,它们在不同的页面上调用。

我已将问题缩小到这个样本:

child.php文件:

  

parent.php文件:

  

调用parent.php会使浏览器无限加载。只要您对session_start()调用之一进行评论,它就会立即加载。

问题的根源是什么? 我非常需要启用会话的页面。

PS我可以通过包含页面来解决它,但它们依赖于URL参数,我想避免为了某种参数代理而修复它们。

5 个答案:

答案 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连接,会话启动等)。然后将该页面包含在所有其他页面上。

相关问题