gaillard/mongo-lock

MongoDB 实现的分布式多读锁

v2.0.1 2014-08-26 14:37 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:08:38 UTC


README

Build Status

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