gaillard / mongo-lock
MongoDB 实现的分布式多读锁
v2.0.1
2014-08-26 14:37 UTC
Requires
- php: >=5.4.0
- ext-mongo: ~1.3
Requires (Dev)
- phpunit/phpunit: ~4.1
- squizlabs/php_codesniffer: ~1.5
This package is not auto-updated.
Last update: 2024-09-24 02:08:38 UTC
README
MongoDB 实现的分布式多读锁
要求
需要 PHP 5.4.0(或更高版本)。
安装
要将库添加为本地、项目的依赖项,请使用 Composer!
{
"require": {
"gaillard/mongo-lock": "~1.0"
}
}
示例
$writer = function($value) { $db = (new \MongoClient())->selectDB('locksExample'); $data = $db->selectCollection('data'); $locker = new Locker($db->selectCollection('locks'), 0); while (true) { $locker->writeLock('theId', 1000); $data->update(['_id' => 1], ['_id' => 1, 'key' => $value], ['upsert' => true]); $data->update(['_id' => 2], ['_id' => 2, 'key' => $value], ['upsert' => true]); $data->update(['_id' => 3], ['_id' => 3, 'key' => $value], ['upsert' => true]); $data->update(['_id' => 4], ['_id' => 4, 'key' => $value], ['upsert' => true]); $locker->writeUnlock('theId'); } }; $reader = function() { $db = (new \MongoClient())->selectDB('locksExample'); $data = $db->selectCollection('data'); $locker = new Locker($db->selectCollection('locks'), 100000); while (true) { $readerId = $locker->readLock('theId', 1000); foreach ($data->find()->sort(['_id' => 1]) as $doc) { echo "{$doc['key']} "; } echo "\n"; $locker->readUnlock('theId', $readerId); usleep(100000); } }; $writerOnePid = pcntl_fork(); if ($writerOnePid === 0) { $writer('pie'); exit; } $writerTwoPid = pcntl_fork(); if ($writerTwoPid === 0) { $writer('cake'); exit; } $readerOnePid = pcntl_fork(); if ($readerOnePid === 0) { $reader(); exit; } $readerTwoPid = pcntl_fork(); if ($readerTwoPid === 0) { $reader(); exit; } sleep(4); posix_kill($writerOnePid, SIGTERM); posix_kill($writerTwoPid, SIGTERM); posix_kill($readerOnePid, SIGTERM); posix_kill($readerTwoPid, SIGTERM);
打印类似的内容
pie pie pie pie pie pie pie pie pie pie pie pie pie pie pie pie pie pie pie pie cake cake cake cake cake cake cake cake pie pie pie pie cake cake cake cake pie pie pie pie cake cake cake cake
你会注意到所有派和蛋糕总是由换行符分隔。这是因为没有读取器在写入时拥有锁。这也表明两个写者不会同时写入。有时在运行示例时,在换行符之前打印的派和蛋糕会多于或少于四个。这是当两个读取器同时拥有锁时的情况。
贡献
如果你想贡献,请使用构建过程进行任何更改,构建通过后,在github上发送pull request!
./build.php