Посмотрите на следующий скрипт хранилища данных:
<?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 не может дать ответ. Может кто-нибудь, пожалуйста, объясните это поведение. Это ошибка во время разработки?