gielfeldt / transactionalphp
事务性PHP。
0.8.0
2016-08-18 11:07 UTC
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2024-09-20 22:38:53 UTC
README
安装
要在您的项目中使用Composer安装Transactional PHP库,首先将以下内容添加到您的composer.json
配置文件中。
{ "require": { "gielfeldt/transactionalphp": "^0.8" } }
然后运行Composer的安装或更新命令以完成安装。有关如何使用Composer的更多信息,请访问Composer主页。
事务性PHP
此类允许在模拟事务中缓冲PHP代码,从而将代码的执行推迟到提交发生时。
动机
- 保持外部缓存与数据库同步的问题,请参阅Drupal模块Cache Consistent。
使用Transactional PHP库
示例1 - 简单
namespace Gielfeldt\TransactionalPHP\Example; require 'vendor/autoload.php'; use Gielfeldt\TransactionalPHP\Connection; $connection = new Connection(); // Start outer transaction. $connection->startTransaction(); $connection->onCommit(function () { print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n"; }); // Start inner transaction. $connection->startTransaction(); $connection->onCommit(function () { print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n"; }); // Rollback inner transaction. $connection->rollbackTransaction(); // Commit inner transaction. $connection->commitTransaction();
示例2 - 提交和回滚
namespace Gielfeldt\TransactionalPHP\Example; require 'vendor/autoload.php'; use Gielfeldt\TransactionalPHP\Connection; use Gielfeldt\TransactionalPHP\Operation; $connection = new Connection(); $operation = new Operation(); $operation->onCommit(function () { print "THIS WILL BE PRINTED IMMEDIATELY, BECAUSE NO TRANSACTION HAS BEGUN\n"; }) ->onRollback(function () { print "THIS WILL NEVER BE PRINTED, BECAUSE NO TRANSACTION HAS BEGUN\n"; }); $connection->addOperation($operation); // Start outer transaction. $connection->startTransaction(); $operation = new Operation(); $operation->onCommit(function () { print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n"; }) ->onRollback(function () { print "THIS WILL NEVER BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n"; }); $connection->addOperation($operation); // Start inner transaction. $connection->startTransaction(); $operation = new Operation(); $operation->onCommit(function () { print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n"; }) ->onRollback(function () { print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n"; }); $connection->addOperation($operation); // Rollback inner transaction. $connection->rollbackTransaction(); // Commit inner transaction. $connection->commitTransaction();
示例3 - 使用索引器
namespace Gielfeldt\TransactionalPHP\Example; require 'vendor/autoload.php'; use Gielfeldt\TransactionalPHP\Connection; use Gielfeldt\TransactionalPHP\Indexer; use Gielfeldt\TransactionalPHP\Operation; $connection = new Connection(); $indexer = new Indexer($connection); $operation = (new Operation()) ->onCommit(function () { print "THIS WILL BE PRINTED IMMEDIATELY, BECAUSE NO TRANSACTION HAS BEGUN\n"; }) ->onRollback(function () { print "THIS WILL NEVER BE PRINTED, BECAUSE NO TRANSACTION HAS BEGUN\n"; }) ->onBuffer(function ($operation) use ($indexer) { print "INDEXING test1\n"; $indexer->index($operation, 'test1'); }) ->setMetadata('value', 'test1'); $connection->addOperation($operation); // Start outer transaction. $connection->startTransaction(); $operation = (new Operation()) ->onCommit(function () { print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n"; }) ->onRollback(function () { print "THIS WILL NEVER BE PRINTED, BECAUSE THIS WILL BE COMMITTED\n"; }) ->onBuffer(function ($operation) use ($indexer) { print "INDEXING test2\n"; $indexer->index($operation, 'test2'); }) ->setMetadata('value', 'test2'); $connection->addOperation($operation); // Start inner transaction. $connection->startTransaction(); $operation = (new Operation()) ->onCommit(function () { print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n"; }) ->onRollback(function () { print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK\n"; }) ->onBuffer(function ($operation) use ($indexer) { print "INDEXING test3\n"; $indexer->index($operation, 'test3'); }) ->setMetadata('value', 'test3'); $connection->addOperation($operation); $operation = (new Operation()) ->onCommit(function () { print "THIS WILL NOT BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK - second\n"; }) ->onRollback(function () { print "THIS WILL BE PRINTED, BECAUSE THIS WILL BE ROLLED BACK - second\n"; }) ->onBuffer(function ($operation) use ($indexer) { print "INDEXING test3 - second\n"; $indexer->index($operation, 'test3'); }) ->setMetadata('value', 'test3 - second'); $connection->addOperation($operation); foreach ($indexer->lookup('test1') as $operation) { print "Looked up test1 - found: " . $operation->getMetadata('value') . "\n"; } foreach ($indexer->lookup('test2') as $operation) { print "Looked up test2 - found: " . $operation->getMetadata('value') . "\n"; } foreach ($indexer->lookup('test3') as $operation) { print "Looked up test3 - found: " . $operation->getMetadata('value') . "\n"; } // Rollback inner transaction. $connection->rollbackTransaction(); // Commit inner transaction. $connection->commitTransaction();
示例4 - 使用索引器进行查找的值存储
namespace Gielfeldt\TransactionalPHP\Example; require 'vendor/autoload.php'; use Gielfeldt\TransactionalPHP\Connection; use Gielfeldt\TransactionalPHP\Indexer; $connection = new Connection(); $indexer = new Indexer($connection); // Start outer transaction. $connection->startTransaction(); print "Started outer transaction\n"; $indexer->index($connection->addMetadata('value', 'value1'), 'test1'); $indexer->index($connection->addMetadata('value', 'value2'), 'test1'); $indexer->index($connection->addMetadata('value', 'value1'), 'test2'); $indexer->index($connection->addMetadata('value', 'value2'), 'test2'); print "Added data to indexer\n"; foreach ($indexer->lookup('test1') as $operation) { print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n"; } foreach ($indexer->lookup('test2') as $operation) { print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n"; } // Start inner transaction. $connection->startTransaction(); print "Started inner transaction\n"; $indexer->index($connection->addMetadata('value', 'value3'), 'test1'); $indexer->index($connection->addMetadata('value', 'value3'), 'test2'); print "Added data to indexer\n"; foreach ($indexer->lookup('test1') as $operation) { print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n"; } foreach ($indexer->lookup('test2') as $operation) { print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n"; } // Rollback inner transaction. $connection->rollbackTransaction(); print "Rolled back inner transaction\n"; foreach ($indexer->lookup('test1') as $operation) { print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n"; } foreach ($indexer->lookup('test2') as $operation) { print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n"; } // Easy values lookup. var_dump($indexer->lookupMetadata('test1', 'value')); var_dump($indexer->lookupMetadata('test2', 'value')); // Commit inner transaction. $connection->commitTransaction(); print "Committed outer transaction\n"; foreach ($indexer->lookup('test1') as $operation) { print "Looked up test1 - found: " . $operation->getMetadata('value'). "\n"; } foreach ($indexer->lookup('test2') as $operation) { print "Looked up test2 - found: " . $operation->getMetadata('value'). "\n"; }
有关更多示例,请参阅examples/文件夹。
特性
- 事务化PHP代码。
- 索引操作用于查找。
注意事项
- 可能很多。