Zend:生成会话ID后从会话数据库表获取行

问题描述:

我试图在认证用户并将会话写入数据库后直接更新由Zend_Session_SaveHandler_DbTable使用的会话表。但是我既不能更新也不能获取新插入的行,即使我用来检查(Zend_Session :: getId())的会话ID是有效的,并且行确实被插入到表中。在获取所有会话ID时(在相同的请求上),我新插入的那个会从结果中丢失。它确实出现在结果中,如果我用其他东西获取它。 我检查过它是否是交易问题,而且看起来并不是问题 - 当我提取结果时没有活动事务。我也尝试在使用sleep()写入后几秒钟读取,这没有帮助。Zend:生成会话ID后从会话数据库表获取行

$auth->getStorage()->write($ident); 
//sleep(1) 
$update = $this->db->update('session', array('uid' => $ident->user_id), 'id='.$this->db->quote(Zend_Session::getId())); 
$qload = 'SELECT id FROM session'; 
$load = $this->db->fetchAll($qload); 
echo $qload; 
print_r($load); 

$ update failed。
$ load不包含用$ auth-> getStorage() - > write($ identity)写入的行。 $ qload确实包含正确的查询 - 将其复制到其他地方会导致预期的结果,即插入的行包含在结果中。

使用的数据库是MySQL - InnoDB。

如果有人知道如何在不修改Zend_Session_SaveHandler_DbTable的情况下直接解决此问题(即在相同的请求上,而不是在重定向到另一个页面之后进行更新):非常感谢!

这不是Zend Framework的问题,而是Sessions如何在PHP中工作的问题。在你的情况下,当你创建一个新的会话时,会生成新的会话ID,但会话只在内存中存在,直到脚本退出。

Source: PHP Session Handling, Notes

你或许可以通过添加不同的表来保存会话元数据,使用所生成的会话ID作为主键(或主键的成分)处理该上相同的请求。如果你走这条路线,扩展Zend_Session_SaveHandler_DbTable并覆盖destroy()方法,以便在Sessions过期并垃圾收集时保持元数据表清洁。

您需要先“分离/释放”您的会话,然后才能对其执行任何操作。 你可以通过调用: Zend_Session :: writeClose(); 然后您应该能够根据需要获取/更新行。请记住,它会使您的会话为只读,因此只要确保在分离后不需要写入即可。