PHP:session_write_close()的替代方案

时间:2014-04-24 16:41:19

标签: php jquery ajax performance zend-framework

情况:

登录后,我有一个可通过菜单访问多个页面的网站。 在仪表板页面(登录后立即看到的页面)上,有一个AJAX调用从PHP-Controller(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()之后尝试写入时出现异常?

提前致谢!

1 个答案:

答案 0 :(得分:0)

一种选择是将会话值存储在数据库中。因此,一旦您拥有了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

或者您可以覆盖默认会话功能,如以下答案:set session in database in php

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