Сценарий хранилища данных Php завершается неудачно на сервере разработки, в то время как выполняется на рабочем сервере, как и ожидалось - PullRequest
0 голосов
/ 30 мая 2019

Посмотрите на следующий скрипт хранилища данных:

<?php
use google\appengine\datastore\v4\Mutation\Operation;
use google\appengine\datastore\v4\BeginTransactionRequest;
use google\appengine\datastore\v4\BeginTransactionResponse;
use google\appengine\datastore\v4\CommitRequest;
use google\appengine\datastore\v4\CommitRequest\Mode;
use google\appengine\datastore\v4\CommitResponse;
use google\appengine\datastore\v4\RollbackRequest;
use google\appengine\datastore\v4\RollbackResponse;
use google\appengine\runtime\ApiProxy;
use google\appengine\runtime\ApplicationError;


function beginTransaction(){
    global $request, $response;
    $request = new BeginTransactionRequest();
    $request->setCrossGroup(true);
    $response = new BeginTransactionResponse();
    try{
        ApiProxy::makeSyncCall('datastore_v4', 'BeginTransaction', $request, $response, 60);
    }
    catch(ApplicationError $e){
        echo $e->getMessage();
        exit();
    }

    $request = new CommitRequest();
    $request->setTransaction($response->transaction);
    $request->setMode(Mode::TRANSACTIONAL);
}

function prepareEntity($entity, $name, $author, $channel){
    global $projectId;
    $entity->mutableKey()->mutablePartitionId()->setDatasetId($projectId);
    $entity->mutableKey()->addPathElement()->setKind('Books');
    $entity->addProperty()->setName('Name')->mutableValue()->setStringValue($name);
    $entity->addProperty()->setName('Author')->mutableValue()->setStringValue($author);
    $entity->addProperty()->setName('Channel')->mutableValue()->setStringValue($channel);
}

function commit(){ 
    global $request, $response;
    $response = new CommitResponse();     
    try{
        ApiProxy::makeSyncCall('datastore_v4', 'Commit', $request, $response, 60);
    }
    catch(ApplicationError $e){
        echo $e->getMessage();
        exit();
    }
}


$projectId = $_SERVER['APPLICATION_ID'];
beginTransaction();

prepareEntity(
    $request->addMutation()->setOp(Operation::INSERT)->mutableEntity(),
    'Contemporary Abstract Algebra',
    'J Gallian',
    'Mutation'
    );

prepareEntity(
    $request->addMutation()->setOp(Operation::INSERT)->mutableEntity(),
    'Principals of Mathematical Analysis',
    'Rudin',
    'Mutation'
    );
commit('Mutation Commit');
echo "<h2>Mutation Commit</h2>";
foreach($response->getMutationResultList() as $mutationResult){
    echo 'Book@'. end($mutationResult->getKey()->getPathElementList())->getId(). '<br/>';
}
echo '<hr/>';

beginTransaction();
prepareEntity(
    $request->mutableDeprecatedMutation()->addInsertAutOId(),
    'Contemporary Abstract Algebra',
    'J Gallian',
    'Deprecated Mutation'
    );

prepareEntity(
    $request->mutableDeprecatedMutation()->addInsertAutOId(),
    'Principals of Mathematical Analysis',
    'Rudin',
    'Deprecated Mutation'
    );

commit();
echo "<h2>Deprecated Mutation Commit</h2>";
foreach($response->getDeprecatedMutationResult()->getInsertAutoIdKeyList() as $key){
    echo 'Book@'. end($key->getPathElementList())->getId(). '<br/>';
}
echo '<hr/>';

В этом сценарии фиксации с использованием мутации не работают на сервере разработки. Они не сохраняют данные и не выдают никаких ошибок. Хотя они работают как положено на производственном сервере. Устаревшие мутации работают должным образом как на сервере разработки, так и на рабочем сервере. Я отладил и обнаружил, что вызов функции make_call в использовании google \ appengine \ runtime \ RealApiProxy не может дать ответ. Может кто-нибудь, пожалуйста, объясните это поведение. Это ошибка во время разработки?

1 Ответ

0 голосов
/ 31 мая 2019

Полагаю, ваша проблема связана со строками use google\appengine\datastore\v4\..., возможно, вам следует использовать библиотеки google-cloud-datastore. Руководство по началу работы: https://cloud.google.com/php/getting-started/using-cloud-datastore.

...