1
| $ composer require symfony/lock predis/predis
|
application/common.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| if(!function_exists('lock_acquire')) {
function lock_acquire(\Symfony\Component\Lock\LockInterface $lock, float $time = 10.0): bool { $time = (float) bcadd(microtime(true), $time, 4);
while (true) { if($time >= microtime(true)) { break; }
if($lock->acquire()) { return true; }
usleep((100 + random_int(-10, 10)) * 1000); }
return false; } }
|
application/api/controller/Index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| use Predis\Client; use Symfony\Component\Lock\LockFactory; use Symfony\Component\Lock\Store\RedisStore;
public function index() { $redis = new Client('tcp://127.0.0.1:6379');
$store = new RedisStore($redis); $factory = new LockFactory($store);
$lock = $factory->createLock('user:1', 300);
if($lock->acquire()) { return '获取到锁'; } else { return '未获取到锁'; }
$lock->acquire(true);
if(lock_acquire($lock, 1)) { return '获取到锁'; } else { return '未获取到锁'; }
$lock = $factory->createLock('user:1', 300, true);
$lock = $factory->createLock('user:1', 300, false);
if(!$lock->acquire()) { return '未获取到锁'; }
try { } finally { $lock->release(); }
$lock->getRemainingLifetime();
$lock->refresh(100);
$lock->isAcquired();
$lock->isExpired(); }
|
参考
https://symfony.com/doc/current/components/lock.html