2010-09-02 67 views
1

我正在做一些“模块”,它被包含到另一个不相关的PHP应用程序中。在我的“模块”中,我需要使用会话。但是,我得到'会话已经开始......'异常。我的“模块”所包含的应用程序正在启动会话。如果我无法在此应用程序中禁用会话,我有什么选择?我想使用Zend_Session,但乍一看似乎不可能。但是,也许有另一种方式?有任何想法吗?PHP会话已经开始了怎么办?

谢谢!

+0

嗯,我已经成功地得到“父”禁用会话,但我仍然不知道是否有当会话已经开始时使用Zend_Session的方式。我想没有。如果有的话,我会回到这里。 – 2010-09-08 14:31:03

回答

5

在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)。

+0

但是,他仍然必须小心,不要干扰其他应用程序的会话变量。 – Alex 2010-09-02 07:00:50

+0

但是,如果我想开始我的会话,如此: $ session = new Zend_Session_Namespace('session'); – 2010-09-02 07:26:59

+0

@sims:对不起,我对Zend_Session_Namespace不熟悉。 – Gumbo 2010-09-02 07:28:00

1

尝试为您的应用程序设置自定义“名称”参数。

默认为PHPSESSID。您可以将其更改为PHPSESSID_MYAPP以避免与其他应用发生冲突。

-1

添加以下代码要使用Session功能前:

@session_start(); 
+0

at-mark(@)做什么? – 2010-09-02 07:28:42

+0

@Sims它被称为'闭嘴运营商' – takeshin 2010-09-02 10:12:42

+0

啊,那件事。我不使用它。而且,由于我没有通过session_start()开始会话,所以它不会起作用。但通过$ session = new Zend_Session_Namespace('session'); – 2010-09-03 01:21:34

相关问题