我正在做一些“模块”,它被包含到另一个不相关的PHP应用程序中。在我的“模块”中,我需要使用会话。但是,我得到'会话已经开始......'异常。我的“模块”所包含的应用程序正在启动会话。如果我无法在此应用程序中禁用会话,我有什么选择?我想使用Zend_Session,但乍一看似乎不可能。但是,也许有另一种方式?有任何想法吗?PHP会话已经开始了怎么办?
谢谢!
我正在做一些“模块”,它被包含到另一个不相关的PHP应用程序中。在我的“模块”中,我需要使用会话。但是,我得到'会话已经开始......'异常。我的“模块”所包含的应用程序正在启动会话。如果我无法在此应用程序中禁用会话,我有什么选择?我想使用Zend_Session,但乍一看似乎不可能。但是,也许有另一种方式?有任何想法吗?PHP会话已经开始了怎么办?
谢谢!
在PHP的会话实现中,一次只能有一个会话。您可以使用session_id
检查目前有一个会话:
if (session_id() === '') {
// no current session
}
现在,如果已经有一个活跃的会话,你可以用session_write_close
结束它,改变会话ID的名字与session_name
以避免冲突,启动会话,并在完成后恢复旧的会话:
$oldName = session_name();
if (session_id() !== '') {
session_write_close();
}
session_name('APPSID');
session_start();
// your session stuff …
session_write_close();
session_name($oldName);
session_start();
这个是PHP的会话实现并只发送最后的会话ID唯一的问题开始会返回给客户端。因此,您需要自行设置透明会话ID(尝试output_add_rewrite_var
)和/或会话cookie(请参阅setcookie
)。
尝试为您的应用程序设置自定义“名称”参数。
默认为PHPSESSID
。您可以将其更改为PHPSESSID_MYAPP
以避免与其他应用发生冲突。
添加以下代码要使用Session功能前:
@session_start();
at-mark(@)做什么? – 2010-09-02 07:28:42
@Sims它被称为'闭嘴运营商' – takeshin 2010-09-02 10:12:42
啊,那件事。我不使用它。而且,由于我没有通过session_start()开始会话,所以它不会起作用。但通过$ session = new Zend_Session_Namespace('session'); – 2010-09-03 01:21:34
嗯,我已经成功地得到“父”禁用会话,但我仍然不知道是否有当会话已经开始时使用Zend_Session的方式。我想没有。如果有的话,我会回到这里。 – 2010-09-08 14:31:03