【问题标题】:error in zend session database for php7php7的zend会话数据库中的错误
【发布时间】:2018-01-30 10:04:59
【问题描述】:

我的应用程序需要使用 database 而不是 file 来进行 session management。 我的应用程序基于 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():无法写入会话数据(用户)。请验证 session.save_path 的当前设置是否正确 (D:\wamp\www\myapp\top\session) 在 D:\wamp\www\myapp\top\library\versions\ZendFramework-1.12.17-minimal\ library\Zend\Session.php 在第 732 行

我正在寻找这个问题的根源。你有什么想法吗?

非常感谢

【问题讨论】:

    标签: php database session zend-framework php-7


    【解决方案1】:

    2016 年 9 月,Zend Framework 1 is reached EOL(生命周期结束)。这意味着它将不再改进。代码库太旧,无法与 PHP 7 很好地配合使用。

    无论如何,你至少有两个选择:

    1. 在您的服务器上降级到 PHP 5.6 或并行运行以支持古老的 ZF1 应用程序。
    2. 通过将 DbTable 处理程序扩展为 suggested here 来编写您自己的会话保存处理程序。

    【讨论】:

    • 我将测试第二个选项。如果有问题,我会降级到php5.6。非常感谢!
    【解决方案2】:

    问题写在这里: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() 都是好的。

    【讨论】:

      【解决方案3】:

      除了 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;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多