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それらはすべて、実行が完了するのを 待ちます。

Google で解決策を探していますが、まだ見つかりません。
お手伝いありがとうございます。

4

1 に答える 1

3

これはセッションロックのように聞こえます。

ファイルシステムに保存されているセッションを使用する場合、PHPはリクエストごとにセッションファイルをロックし、そのリクエストが完了したときにのみ無料で提供します。ファイルがロックされている間、そのファイルにアクセスしたい他のリクエストはすべてハングして待機します。

チャットスクリプトは永久にループし、新しいメッセージをチェックするため、セッションファイルも永久にロックされ、同じユーザーがセッションアクセスを必要とするサイトの異なるセクションにアクセスするのを防ぎます。

解決策は、要求を満たすために必要なすべてのセッションデータをメモリにロードし、Zend_Session::writeCloseできるだけ早く使用してロックを解除することです。

于 2012-10-10T10:56:34.393 に答える