Asynchronous Redlock -Algorithmus -Implementierung für PHP
Nach der Installation können Sie Redlock in Ihre Projekte einbeziehen, indem Sie seinen Verwalter instanziieren. Diese Entität ist für die Lock -Orchestrierung verantwortlich und erfordert Zugriff auf eine Redis -Client -Objektinstanz, z. B.
/* Instantiate prerequisites */
$ factory = new Clue React Redis Factory ();
$ client = $ factory -> createLazyClient ( ' 127.0.0.1 ' );
/* Instantiate our lock custodian */
$ custodian = new RTCKit React Redlock Custodian ( $ client ); Für Anwendungsfälle, in denen ein binäres Ergebnis wünschenswert ist, funktioniert die acquire() -Methode am besten, z. B.:
/**
* @param string $resource Redis key name
* @param float $ttl Lock's time to live (in seconds)
* @param ?string $token Unique identifier for lock in question
* @return PromiseInterface
*/
$ custodian -> acquire ( ' MyResource ' , 60 , ' r4nd0m_token ' )
-> then ( function (? Lock $ lock ) {
if ( is_null ( $ lock )) {
// Ooops, lock could not be acquired for MyResource
} else {
// Awesome, MyResource is locked for a minute
// ...
// Be nice and release the lock when done
$ custodian -> release ( $ lock );
}
}); Die spin() -Methode ist für Situationen ausgelegt, in denen ein Prozess weiterhin versuchen sollte, ein Schloss zu erwerben, z. B.
/**
* @param int $attempts Maximum spin/tries
* @param float $interval Spin/try interval (in seconds)
* @param string $resource Redis key name
* @param float $ttl Lock's time to live (in seconds)
* @param ?string $token Unique identifier for lock in question
* @return PromiseInterface
*/
$ custodian -> spin ( 100 , 0.5 , ' HotResource ' , 10 , ' r4nd0m_token ' )
-> then ( function (? Lock $ lock ): void {
if ( is_null ( $ lock )) {
// Wow, after 100 tries (with a gap of 0.5 seconds) I've
// given up acquiring a lock on HotResource
} else {
// Awesome, HotResource is locked for 10 seconds
// ...
// Again, be nice and release the lock when done
$ custodian -> release ( $ lock );
}
})Schließlich sind die vorgesehenen Beispiele ein guter Ausgangspunkt.
Redlock ist mit PHP 7.2+ kompatibel und benötigt die Hinweis/ReactPHP-Redis-Bibliothek.
Sie können die Bibliothek als Projektabhängigkeit mit Composer hinzufügen:
composer require rtckit/react-redlockWenn Sie die Bibliothek nur während der Entwicklung benötigen, beispielsweise wenn Sie in Ihrer Testsuite verwendet werden, sollten Sie sie nur als Abhängigkeit von Entwicklungen hinzufügen:
composer require --dev rtckit/react-redlockKlonen Sie dieses Repository, um die Testsuite auszuführen, und installieren Sie dann Abhängigkeiten über den Komponisten:
composer installGehen Sie dann zur Projektwurzel und rennen Sie:
php -d memory_limit=-1 ./vendor/bin/phpunit -c ./etc/phpunit.xml.distUm eine hohe Codequalität zu gewährleisten, verwendet Redlock Phpstan und Psalm:
php -d memory_limit=-1 ./vendor/bin/phpstan analyse -c ./etc/phpstan.neon -n -vvv --ansi --level=max src
php -d memory_limit=-1 ./vendor/bin/psalm --config=./etc/psalm.xml --show-info=trueMIT, siehe Lizenzdatei.
Fehlerberichte (und kleine Patches) können über den Problemverfolger eingereicht werden. Das Abgeben des Repositorys und das Einreichen einer Pull -Anfrage wird für wesentliche Patches bevorzugt.