我正在使用Zend Framework构建聊天功能
在javascript中,我使用ajax向函数pullAction请求http://mydomain.com/chat/pull
,如此
public function pullAction() {
while ( true ) {
try {
$chat = Eezy_Chat::getNewMessage();
if($chat){
$chat->printMessage();
break;
}
sleep ( 1 ); // sleep 1 secound between each loop
} catch ( Zend_Db_Adapter_Exception $ex ) {
if ($ex->getCode () == 2006) { // reconnect db if timeout
$dbAdapter = Zend_Db_Table::getDefaultAdapter ();
$dbAdapter->closeConnection ();
$dbAdapter->getConnection ();
}
}
}
}
此操作将一直运行,直到其他用户发送一些消息
但是当这个请求正在运行时,我无法访问我网站上的任何其他页面。所有这些都等待http://mydomain.com/chat/pull
完成执行。
我在Google上搜索解决方案,但仍未找到。
谢谢你的帮助。
答案 0 :(得分:3)
这听起来像会话锁定。
当您使用存储在文件系统上的会话时,PHP将锁定每个请求上的会话文件,并且只在该请求通过时才释放它。当文件被锁定时,任何其他想要访问该文件的请求都会挂起并等待。
由于您的聊天脚本将永远循环,检查新消息,会话文件也将永久锁定,阻止同一用户访问需要会话访问的站点的不同部分。
解决方案是将完成请求所需的所有会话数据加载到内存中,然后尽快使用Zend_Session::writeClose
释放锁定。