Implémentation d'algorithme Redlock asynchrone pour PHP
Une fois installé, vous pouvez incorporer Redlock dans vos projets en instanciant son gardien ; Cette entité est responsable de l'orchestration de verrouillage et nécessite l'accès à une instance d'objet client redis, par exemple
/* 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 ); Pour les cas d'utilisation où un résultat binaire est souhaitable, la méthode acquire() fonctionne mieux, par exemple:
/**
* @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 );
}
}); La méthode spin() est conçue pour les situations où un processus devrait continuer d'essayer d'acquérir une serrure, par exemple
/**
* @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 );
}
})Enfin, les exemples fournis sont un bon point de départ.
Redlock est compatible avec PHP 7.2+ et nécessite la bibliothèque Clue / Reactphp-Redis.
Vous pouvez ajouter la bibliothèque en tant que dépendance du projet à l'aide du compositeur:
composer require rtckit/react-redlockSi vous n'avez besoin que de la bibliothèque pendant le développement, par exemple lorsqu'il est utilisé dans votre suite de tests, vous devez l'ajouter en tant que dépendance à développement uniquement:
composer require --dev rtckit/react-redlockPour exécuter la suite de test, cloner ce référentiel, puis installer des dépendances via le compositeur:
composer installEnsuite, allez à la racine du projet et exécutez:
php -d memory_limit=-1 ./vendor/bin/phpunit -c ./etc/phpunit.xml.distAfin d'assurer une qualité de code élevée, Redlock utilise le phpstan et le psaume:
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, voir le fichier de licence.
Les rapports de bogues (et les petits correctifs) peuvent être soumis via le suivi du problème. La suppression du référentiel et la soumission d'une demande de traction sont préférées pour des correctifs substantiels.