4

私は主にデータを取得するためのビューで作業するアプリケーションに取り組んでいます。
私がやろうとしているのは、ドキュメントを保存し、リダイレクトして、保存されたドキュメントが利用可能かどうかを確認することです(これは、ドキュメントキーではなく別の値を探しているため、ビューを介して行われます)。

私は何を使用していますか?

Debian Wheezy 上の PHP(5.4.21)、Couchbase(2.1.1)、および Couchbase(1.1) 用の PHP SDK。

それで、何が起こっているのですか?

API 関数を使用してドキュメントを保存し、少なくとも を含むAPI 関数をset($id, $document)使用してビューの更新をトリガーし、新しく追加されたドキュメントをチェックする/または単に表示したい別のページにリダイレクトします。 しかし、新しく追加されたドキュメントが常に表示されるとは限らないか、存在するかどうかの私のチェックに常に合格するとは限りません。view($designDocument, $viewName, $options)$options'stale'=>false

私がより詳細に使用しているコードに従ってください:

public function store(AbstractDocument $document)
{
    $result = $this->bucket->storeDocument($document->getId(), 
                                           json_encode($document));
    $this->afterSave();

    return $result;
}

public function storeDocument($id, $document)
{
    if (!is_string($document)) {
        $document = json_encode($document);
    }
    $res = $this->couchbase->set($id, $document);

    return $res;
}

public function afterSave()
{
    $this->bucket->triggerViewIndexing(
        $this->getDesignDocumentName(),
        Config::KEY_COUCHBASE_VIEW_USER_USERLIST
    );
}

public function triggerViewIndexing($designDocument, $viewName)
{
    $options = ['limit' => 1, 'stale' => false];
    $res     = $this->couchbase->view($designDocument, $viewName, $options);
}

コードに示されているように、stale パラメーターを false に設定して、インデックスが確実に更新されるようにします。
しかし、それは機能していないようです。

この質問を書く前に、Couchbase フォーラムのスレッド、Stackoverflow への投稿、Couchbase の PHP SDK のドキュメント、および Couchbase の一般的なドキュメントを調べました。そのため、 staleがどのように機能するか、どのような制限
がある かを理解していると思います。 ドキュメントがメモリ内になく、ディスクに書き込まれている (または既に書き込まれている) 場合にのみ、stale が機能するという私の仮定が間違っている場合は、お気軽に修正してください。

私がやろうとしていることがうまくいかないので、私はさまざまなことを試しました.

たとえば、 のデフォルトの動作が である場合staleupdate_afterインデックスの更新を 2 回トリガーすることで問題が解決すると考えました。
まあ、そうではありませんでした。

その他特筆すべき点は、

$this->couchbase->keyDurability($id,$res);
$this->couchbase->observe($id, $res);

で文書を保存した直後にset、別々に、必死になって組み合わせて使用​​しました。トリックもしなかった。

ここで間違っているのは、PHP SDK が何らかの形でstale=falseパラメーターを通過しておらず、 keyDurabilityが想定どおりに機能していないということです。新しく作成されたドキュメントをチェックするときにも渡すのでstale=false、もちろん両方 (トリガーとチェック) が同じバケットとビューで機能します。

または、気付かないうちに何かひどく間違ったことをしています。

何が起こっているのか理解できないので、誰かが私を正しい方向に向けて、できれば何がうまくいかないのか説明してくれたらうれしいです. keyDurability私の理解によれば、stale少なくともすべてがうまくいくはずです。

4

1 に答える 1

2

ビューの更新に関する「問題」は、ディスクに永続化されたデータのみを使用することです。keyDurability() を使用して、これが発生したかどうかを確認できますが、作成したばかりの要素の id と cas が必要です。

triggerViewIndexing 関数を次のように変更します。

/**
 * @param $designDocument
 * @param $viewName
 * @param null $id
 * @param null $cas
 */
public function triggerViewIndexing($designDocument, $viewName, $id = null, $cas = null)
{
    if (!empty($id) && !empty($cas)) {
        $details = [
            'persist_to' => 1, //The number of nodes the document should be persisted to
            'timeout'    => 2000, // The max time to wait for durability
            'interval'   => 100 //The interval between checking the state of the document
        ];
        $this->couchbase->keyDurability($id, $cas, $details);
    }

    $options = ['limit' => 1, 'stale' => false];
    $res = $this->couchbase->view($designDocument, $viewName, $options);
}

これは、アイテムがディスクに書き込まれる場合、最大 2000 ミリ秒まで 100 ミリ秒ごとにチェックします。その後、ビューをトリガーすると、データが更新されます。

于 2013-12-23T15:09:04.060 に答える