繁体   English   中英

PHP:session_write_close()的替代方法

[英]PHP: Alternative for session_write_close()

情况:

登录后,我有一个可以通过菜单访问多个页面的站点。 在仪表板页面(登录后立即看到的页面)上,有一个AJAX调用,用于从PHP控制器(zend框架)获取数据。 该调用对2个不同的数据库进行约20个查询,并进行大量数据操作。 加载所有内容可能需要5秒钟的时间。 到现在为止还挺好!

我的问题:

当我通过菜单转到另一个页面时,看到主页后,立即取消了ajax调用,并且将新请求发送到新的PHP控制器。 但是因为我正在使用php-sessions(通过zend-framework),所以在session_write_close()被调用之前(长期的AJAX请求的结尾),我无法执行新的请求。 上一个通话是否有可能被取消?

一个不体面的解决方案:

现在,我已经在我的AJAX请求的开始处调用了session_write_close(),这解决了该问题。 之后,我仍然从会议中阅读,但是我已经阅读并确认这不是问题。 尽管如此,调用session_write_close()并不是最漂亮的事情,并且我正在与这个项目中的几个人一起工作,该项目具有许多文件和代码路径,并且不会在未来5年内完成。 。所以我不能使用session_write_close(),因为它将无法维护。 特别是因为当您写入会话时,PHP不会引发异常。 数据将无法保存。

所以我的问题是

是否可以使用session_write_close()替代方法,让我中断/取消AJAX调用(在PHP方面),以立即转到另一个页面,或者可以更改设置,以便在尝试时PHP会引发异常session_write_close()被调用后写?

提前致谢!

一种选择是将会话值存储在数据库中。 因此,一旦有了session_id,就可以使用更新后的值读写数据库。 它看起来像这样:

$session_id = session_id();
session_write_close();
$query = $dbh->prepare("select * from tbl_sessions where session_id=?");
$result = $query->execute(array($session_id));
$values = $result->fetch();
$session_values = json_decode($values->data); //data would be a text column with a json or serialized array
//you could update any values then update tbl_sessions if you needed

或者您可以覆盖默认的会话功能,例如此答案: 在php中的数据库中设置会话

或者作为另一个答案,您可以根据需要关闭和打开会话: https : //stackoverflow.com/a/10046611/1401720

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM