Я работаю над приложением, где я работаю в основном с представлениями для получения данных.
Что я пытаюсь сделать, так это сохранить документ, перенаправить и проверить, доступен ли сохраненный документ (это делается через представление, потому что Я ищу не ключ документа, а другое значение).
Что я использую?
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
.