Locker Koşul Kilidi
Locker, kooperatifler arası senkronizasyon için kullanılan bir bellek kilididir. Genellikle, belirli bir kritik kaynağa (örneğin bir veritabanı bileşeni) erişimi sıralamak amacıyla kullanılır; bu kaynak bir bağlantı havuzuna sahip değilse, Locker kullanılarak bu bileşene sıra ile erişim sağlanır ve birden fazla kooperatifin aynı bağlantı kaynağını aynı anda kullanması sonucu oluşabilecek veri tutarsızlıkları önlenir.
İpucu
Bu özellik workerman>=5.1.0 gerektirir.
Dikkat
- Locker, Swoole/Swow/Fiber/Select/Event tabanlıdır.
- Locker, aynı süreç içindeki farklı kooperatiflerin belirli bir kaynağa sıralı ve karşıt erişim sağlayabilmesi için tasarlanmıştır; süreçler arası etki yoktur.
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Locker;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // veya Swow::class veya Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
static $redis;
if (!$redis) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
}
// Aynı bağlantıyı farklı kooperatifler kullanırken "Socket#10 has already been bound to another coroutine" hatasının oluşmasını önleyin.
Locker::lock('redis');
$time = $redis->time();
Locker::unlock('redis');
$connection->send(json_encode($time));
};
Worker::runAll();
Arayüz Açıklaması
interface LockerInterface
{
/**
* Kilitleme
*/
public static function lock(string $key): bool
/**
* Kilidi açma
*/
public static function unlock(string $key): bool
}