使用Zend_Session组件,有4种开启会话的方法,其中2种是错误的。
错误的:不要开启PHP的session.auto_startsetting。如果你使用mode_php(或等同)并在php.ini中已经开启了该选项,而你又没有权限去关闭该选项,你可以在.htaccess文件(这个文件通常在HTML文档根目录下)中增加下面这一句:
php_value session.auto_start 0
错误的:不要直接使用PHP的session_start()函数。如果你直接使用session_start(),之后再使用Zend_Session_Namespace,那么Zend_Session::start()会抛出("会话已经开始")的异常。如果你在使用Zend_Session_Namespace或使用Zend_Session::start()后调用session_start(),那么会产生一个E_NOTICE级别的错误,且该调用将会被忽略。
正确的:使用Zend_Session::start()开启会话。如果你想让每个页面请求都开启会话,那么应该在ZF应用程序的引导文件(index.php)中尽早的调用这个函数。开启会话有些额外的开销,如果只有部分页面请求需要开启会话,那么就:
在引导文件中,使用Zend_Session::setOptions()无条件地设置strict选项为true。
在任何Zend_Session_Namespace()对象初始化之前对需要使用会话的请求只调用Zend_Session::start()。
象往常一样,在需要会话的地方,使用"new Zend_Session_Namespace()",但必须确认先前已经调用过Zend_Session::start()了。
strict 选项防止 new Zend_Session_Namespace() 自动调用 Zend_Session::start()。 这样,这个选项有利于应用程序的开发者强制执行一个设计原则以避免在某些页面请求中使用会话, 因为在调用 Zend_Session::start() 之前,实例化 Zend_Session_Namespace 时,会抛出一个异常。开发者需小心地考虑使用 Zend_Session::setOptions() 所引起的冲突,由于它们对应于基本的ext/session这些具有全局作用选项。
正确的:只要有需要使用会话的地方,就初始化new Zend_Session_Namespace(),并且基本的PHP会话将自动开启。这个极端简单的用法能在大多数的情形下很好地工作。然而,如果你使用地是默认的基于cookie的会话(强烈推荐使用这种方式),你必须确保在第一次调用new Zend_Session_Namespace()在任何PHP发向向客户端输出(例如,HTTP headers)之前。参见 第 35.4.2 节 “错误:Headers Already Sent” 有更多的信息。
FlashMessenger:http://www.kamiladryjanek.com/2009/01/zend-framework-smarty-flash
messenger-helper/