3

我正在使用 Zend Framework 构建聊天功能。
在javascript中,我使用ajax来请求这样http://mydomain.com/chat/pull的函数pullAction

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完成它的执行。

我在谷歌上寻找解决方案,但仍然没有找到。
感谢您的帮助。

4

1 回答 1

3

这听起来像会话锁定。

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

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

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

于 2012-10-10T10:56:34.393 回答