Locker Coroutine-Sperre
Locker ist eine Speicher-Sperre, die zur Synchronisation zwischen Koroutinen verwendet wird. Sie wird häufig eingesetzt, um in Koroutinen den Zugriff auf eine kritische Ressource zu steuern, beispielsweise wenn eine Datenbankkomponente keinen Verbindungspool implementiert. In diesem Fall kann Locker verwendet werden, um den Zugriff auf diese Komponente zu regeln und zu verhindern, dass mehrere Koroutinen gleichzeitig die gleiche Verbindungsressource nutzen, was zu Datenanomalien führen könnte.
Hinweis
Diese Funktion erfordert workerman>=5.1.0
Achtung
- Locker unterstützt Swoole/Swow/Fiber/Select/Event-gesteuerten Betrieb
- Locker dient der gegenseitigen Zugangskontrolle von verschiedenen Koroutinen innerhalb desselben Prozesses, die Prozesse untereinander beeinflussen sich nicht.
<?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; // Oder Swow::class oder Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
static $redis;
if (!$redis) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
}
// Verhindern, dass mehrere Koroutinen gleichzeitig dieselbe Verbindung nutzen, was zu Fehlern wie "Socket#10 has already been bound to another coroutine" führen kann
Locker::lock('redis');
$time = $redis->time();
Locker::unlock('redis');
$connection->send(json_encode($time));
};
Worker::runAll();
Schnittstellenerklärung
interface LockerInterface
{
/**
* Sperren
*/
public static function lock(string $key): bool
/**
* Entsperren
*/
public static function unlock(string $key): bool
}