alxmsl/primitives
包含基本数据结构的简单库:集合、队列等。
v1.7.2
2015-03-30 18:10 UTC
Requires
- alxmsl/connection: >=1.1.2
Requires (Dev)
- phpunit/phpunit: 4.5.*
README
抽象基本数据结构(如集合、队列等)的基础类。
在 Redis 存储上使用集合的示例
use alxmsl\Connection\Redis\RedisFactory;
use alxmsl\Primitives\SetFactory;
// Create redis connection
$Connection = RedisFactory::createRedisByConfig(array(
'host' => 'localhost',
'port' => 6379,
));
// Create set on the redis connection
$Set = SetFactory::createRedisSet('test', $Connection);
// Add set elements
$Set->add('obj_01');
$Set->add('obj_02');
// Check items existence
var_dump($Set->exists('obj_01'), $Set->exists('obj_03'));
在 Postgres 表上使用集合的示例
use alxmsl\Connection\Postgresql\Connection;
use alxmsl\Primitives\SetFactory;
// Create new postgres connection
$Connection = new Connection();
$Connection->setNeedBusyCheckup(false)
->setUserName('postgres')
->setPassword('postgres')
->setDatabase('postgres')
->setHost('localhost')
->setPort(5432);
// Create set instance
$Set = SetFactory::createPostgresSet('test', $Connection);
// Add items to set
$Set->add('obj_01');
$Set->add('obj_02');
// Check items existence
var_dump($Set->exists('obj_01'), $Set->exists('obj_03'));
集合迭代
使用集合实例,您可以启用迭代器支持。只需启用列表模式
$Set->getProvider()->setEnlistedMode(true);
然后使用集合的迭代器
foreach ($Set->getIterator() as $item) {
var_dump($item);
}
在 Redis 存储上使用队列的示例
use alxmsl\Connection\Redis\RedisFactory;
use alxmsl\Primitives\QueueFactory;
$Connection = RedisFactory::createRedisByConfig(array(
'host' => 'localhost',
'port' => 6379,
));
$Queue = QueueFactory::createRedisQueue('myqueue_01', $Connection);
$queue = array(1, 2, 4, 5, 6, 7, 8, 5);
foreach ($queue as $item) {
$Queue->enqueue($item);
}
$result = array();
for (;;) {
$item = $Queue->dequeue();
if ($item !== false) {
$result[] = $item;
} else {
break;
}
}
$diff = array_diff($queue, $result);
var_dump(empty($diff));
当然,队列实例实现了迭代器接口。使用示例
foreach ($queue as $item) {
$Queue->enqueue($item);
}
$result = array();
foreach ($Queue->getIterator() as $item) {
$result[] = $item;
}
$diff = array_diff($queue, $result);
var_dump(empty($diff));
队列池使用示例
$Queue1 = QueueFactory::createRedisQueue('myqueue_pool_01', $Connection1);
$Queue2 = QueueFactory::createRedisQueue('myqueue_pool_02', $Connection2);
// Create new pool
$Pool = new Pool();
$Pool->addQueue($Queue1)
->addQueue($Queue2);
// Write to pool
$items = range(1, 5);
foreach ($items as $item) {
$Pool->enqueue($item);
printf("enqueued: %s\n", $item);
}
// Flush pool
while ($Item = $Pool->dequeue()) {
printf("dequeued: %s\n", $Item);
}
分层缓存使用示例
$RootCache = CacheFactory::createMemcachedCache('key_03', Cache::getClass(), $Connection);
$Level2Cache = CacheFactory::createMemcachedCache('key_03', Level2Cache::getClass(), $Connection);
$Level3Cache = CacheFactory::createMemcachedCache('key_03', Level3Cache::getClass(), $Connection);
// Leveled value write and read
$Level3Cache->set('some_level3_key', 5, Item::TYPE_NUMBER);
unset($Level3Cache);
$Level3Cache = CacheFactory::createMemcachedCache('key_03', Level3Cache::getClass(), $Connection);
var_dump($Level3Cache->get('some_level3_key')->getValue() == 5);
// Check cached level 3 value from level 2
$Level2Value = $Level2Cache->get('level3')->getValue();
var_dump($Level2Value->some_level3_key->getValue() == $Level3Cache->get('some_level3_key')->getValue());
// Check cached level 3 value from root level
$RootLevelValue = $RootCache->get('level2')->getValue();
var_dump($RootLevelValue->level3->getValue()->some_level3_key->getValue() == $Level3Cache->get('some_level3_key')->getValue());
// Set another value on level 2 and invalidate level 3
$Level2Cache->set('another_level2_key', 7);
$Level3Cache->invalidate();
unset($Level2Cache);
// Then check level 2 cached value
$Level2Cache = CacheFactory::createMemcachedCache('key_03', Level2Cache::getClass(), $Connection);
var_dump($Level2Cache->get('another_level2_key')->getValue() == 7);
// Check what level 3 is empty
try {
$Level2Cache->get('level3');
printf("error: level3 was not delete\n");
} catch (MissingException $Ex) {
var_dump(true);
}
信号量使用示例
// Create semaphore instance
$Semaphore = SemaphoreFactory::createRedisSemaphore($Connection, 'locker');
// Use semaphore
$result = $Semaphore->wait();
if ($result) {
sleep(1);
$Semaphore->signal();
} else {
printf("semaphore are locked now\n");
}
许可证
版权 © 2014 Alexey Maslov alexey.y.maslov@gmail.com 本作品是免费的。您可以在 Do What The Fuck You Want To Public License,Version 2 的条款下重新分发和/或修改它,如 Sam Hocevar 发布。有关更多详细信息,请参阅 COPYING 文件。