Представление Couchbase не обновляется после установки из PHP SDK

Я работаю над приложением, где я работаю в основном с представлениями для получения данных.
Что я пытаюсь сделать, так это сохранить документ, перенаправить и проверить, доступен ли сохраненный документ (это делается через представление, потому что Я ищу не ключ документа, а другое значение).

Что я использую?

PHP(5.4.21), Couchbase(2.1.1) и PHP SDK для Couchbase(1.1) на Debian Wheezy.

Итак, что происходит?

Я сохраняю документ с помощью функции API set($id, $document), затем запускаю обновление представления с помощью функции API 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, документацию PHP SDK для Couchbase и общую документацию Couchbase.
Итак, я думаю, что понимаю, как stale должен работать и что ограничения кажутся.
Если мое предположение, что устаревшее работает, но только тогда, когда документ больше не находится в памяти, но находится в записано на диск (или уже записано), неверно, пожалуйста, поправьте меня.

Поскольку то, что я пытаюсь сделать, не работает, я пробовал разные вещи, которые также упоминались в нескольких объяснениях и документации, которые должны были помочь достичь желаемого результата.

Например, я думал, что если поведение stale по умолчанию равно update_after, то двукратное обновление индекса решит проблему.
Но это не так.

Другими примечательными вещами являются

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

Я использовал их сразу после сохранения документа с set, отдельно и от безысходности в сочетании. Тоже не справился.

Мое предположение, что здесь не так, заключается в том, что PHP SDK каким-то образом не проходит через параметр stale=false и keyDurability не делает того, что должен. Поскольку я также передаю stale=false при проверке вновь созданного документа, конечно, оба (триггер и проверка) работают в одном и том же сегменте и представлении.

Или я делаю что-то ужасно неправильное, не замечая этого.

Я был бы рад, если бы кто-нибудь мог указать мне правильное направление и, надеюсь, объяснить, что происходит не так, поскольку я не могу понять, что происходит. Насколько я понимаю, все должно работать как минимум с keyDurability и stale.


person tombul    schedule 20.11.2013    source источник


Ответы (1)


«Проблема» обновления представлений заключается в том, что при этом используются только данные, сохраненные на диске. Вы можете использовать keyDurability(), чтобы проверить, произошло ли это, НО вам нужен идентификатор и 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);
}

Это будет проверять каждые 100 мс максимум 2000 мс, если элемент записывается на диск. После этого запуск представления обновит данные.

person nr404    schedule 23.12.2013
comment
Забавно, я пытался передать id и cas в качестве параметров, но не передал никаких дополнительных параметров ($details), так как все они должны иметь значения по умолчанию. Согласно документации php sdk для persist_to по умолчанию установлено значение 1, поэтому я подумал, что нет необходимости. Но, кажется, это помогает. Для меня это выглядит так, как будто это может быть еще одна ошибка (или назовите это ошибкой, если хотите) в php sdk, поскольку ранее я пытался использовать идентификатор и cas, но persist_to работает. Спасибо дружище, очень помог! - person tombul; 07.01.2014