Zend奇怪的行为:第一个请求仍在运行时无法处理第二个请求

时间:2012-10-10 10:30:21

标签: php zend-framework pdo

我正在使用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上搜索解决方案,但仍未找到。
谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

这听起来像会话锁定。

当您使用存储在文件系统上的会话时,PHP将锁定每个请求上的会话文件,并且只在该请求通过时才释放它。当文件被锁定时,任何其他想要访问该文件的请求都会挂起并等待。

由于您的聊天脚本将永远循环,检查新消息,会话文件也将永久锁定,阻止同一用户访问需要会话访问的站点的不同部分。

解决方案是将完成请求所需的所有会话数据加载到内存中,然后尽快使用Zend_Session::writeClose释放锁定。