0

上下文:我打算使用 mod_rewrite (首页加载子页面)构建应用程序,但在从前端控制器页面加载 session_enabled 页面时卡住了。

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

我已将问题缩小到此示例:

child.php 文件:

父.php 文件:

调用 parent.php 将使浏览器无限加载。只要您评论其中一个 session_start() 调用 - 它会立即加载。

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

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

4

5 回答 5

5

session_write_close()一旦不再需要写入会话,您就需要调用。目前,由于您的两个脚本在整个持续时间内都打开了会话,因此您一次只能运行一个。

手册中

会话数据通常在脚本终止后存储而无需调用session_write_close(),但由于会话数据被锁定以防止并发写入,因此在任何时候只有一个脚本可以对会话进行操作。将框架集与会话一起使用时,由于这种锁定,您将体验到一个一个加载的框架。您可以通过在会话变量的所有更改完成后立即结束会话来减少加载所有帧所需的时间。

于 2009-02-26T13:34:21.283 回答
1

在加载子页面之前尝试使用session_write_close() 。

于 2009-02-26T13:35:38.190 回答
1

您还可以检查会话是否已经启动,如果没有,则仅启动一个新会话:

    if (!isset($_SESSION)) session_start();
于 2009-02-26T13:39:29.413 回答
1

除此之外,一次只能使用一个会话。您需要调用该session_regenerate_id函数来生成新 ID:

if (session_id() != '') {
    session_write_close();
}
session_start();
session_regenerate_id();

否则,父会话 ID 也将用于子会话。

于 2009-02-26T13:41:13.230 回答
0

无论如何,在你的脚本中有两个 session_starts() 是一件坏事。

为什么不直接在 parent.php 文件(而不是 child.php)上启动会话?或者只是 child.php 而不是 parent.php

让一个页面包含在初始化所有其他页面(SQL 连接、会话启动等)的所有其他页面中是个好主意。然后将该页面包含在所有其他页面上。

于 2009-02-26T13:35:25.507 回答