我的应用需要使用数据库代替文件进行会话管理。 我的应用程序基于Zend Framework 1.12.17,php 5.6.25和实际上在wampserver
那是我的config.ini
resources.session.use_only_cookies = true
resources.session.gc_maxlifetime = 864000
resources.session.remember_me_seconds = 864000
resources.session.gc_probability = 1
resources.session.gc_divisor = 100
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "app_session"
resources.session.saveHandler.options.primary = "id"
resources.session.saveHandler.options.modifiedColumn = "modified"
resources.session.saveHandler.options.dataColumn = "data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"
当我想将php升级到php 7.0.10时,发生了警告
警告:session_write_close():无法写入会话数据(用户)。请在D:\ wamp \ www \ myapp \ top \ library \ versions \ ZendFramework-1.12.17-minimal \中验证session.save_path的当前设置是否正确(D:\ wamp \ www \ myapp \ top \ session)第732行的库\ Zend \ Session.php
我正在寻找这个问题的根源。你有什么想法吗?
非常感谢
答案 0 :(得分:2)
2016年9月,Zend Framework 1 is reached EOL(寿命终止)。这意味着它将不再被改进。代码库太旧了,无法与PHP 7一起使用。
无论如何,你至少有两个选择:
答案 1 :(得分:1)
除了edigus之外,这里还有扩展保存处理程序的简单实现:
<?php
require_once 'Zend/Session/SaveHandler/DbTable.php';
// NOTE: To fix an issue with Zend_Session_SaveHandler_DbTable on PHP 7 this class extends it and overrides the write
// method to simply always return true.
//
// See: https://stackoverflow.com/a/44985594/1510754
// See: https://github.com/zendframework/zf1/issues/665
// See: https://github.com/zendframework/zf1/pull/654
class My_Session_SaveHandler_DbTable extends Zend_Session_SaveHandler_DbTable
{
public function write($id, $data)
{
parent::write($id, $data);
return true;
}
}
答案 2 :(得分:1)
问题写在这里:https://github.com/zendframework/zf1/issues/665#issue-127528467
由于更新返回0但没有抛出异常仍然是一个成功的查询,没有错误
因此,函数write
将返回false
而不是true
,而PHP 7.0需要true
结果。
您可以通过更改Zend/Session/SaveHandler/DbTable.php
:
if ($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) {
要:
if (is_int($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE)))) {
或者您也可以删除if
,将其转换为指令,并保留$return = true;
。因为在出错时,查询应该引发异常,因此任何没有异常的update()
都是好的。