Quel est le principe de l'ajout d'un verrouillage mémoire à un événement de loterie PHP ? Comment l'implémenter ?
fonction publique acquérir ($ clé) {
//Si vous devez acquérir deux verrous en même temps
if ( is_array($key) && count($key) == 2 ) {
tandis que (VRAI) {
$res = tableau();
foreach($clé comme $k => $v) {
$res[$k] = $this->acquérir($v);
si ( !$res[$k] ) {
casser;
}
}
//Si le premier verrou n'est pas obtenu, retournez directement
si ( !$res[0] ) {
$err = nouveau SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
ErrorHandle::throwErr($err);
} elseif( !$res[1] ) {
// Libérez le premier verrou, attendez et réessayez
$this->release($key[0]);
usleep(LockConfig::LOCK_TIMEWAIT);
} autre {
retourner VRAI ;
}
}
} autre {
$lock_key = LockConfig::LOCK_PREFIX $clé;
$je = 0 ;
faire {
$lock = $this->_memcache->add( $lock_key, 1, LockConfig::LOCK_TIMEOUT );
//Si le verrou n'est pas obtenu pour la première fois, attendez le temps spécifié et réessayez.
si ($i > 0) {
usleep(LockConfig::LOCK_TIMEWAIT);
}
$i++;
//Quitter après avoir dépassé le nombre de tentatives
si ($i > LockConfig::LOCK_RETRY_TIMES) {
$err = nouveau SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
ErrorHandle::throwErr($err);
}
} while( !$lock );
// enregistrement du journal
si ($i > 1) {
LogHelper::warning('lock.log', "Acquérir le verrou '{$lock_key}' pendant {$i} fois");
}
retourner $lock;
}
}
/**
* Libérer le verrouillage de la mémoire
*
* @param string $key La valeur de la clé après suppression du préfixe du verrou mémoire
* @return bool Renvoie VRAI si la libération est réussie
*/
version de fonction publique ($ clé) {
$lock_key = LockConfig::LOCK_PREFIX $clé;
return $this->_memcache->delete ($lock_key);
Vous n'avez pas besoin du verrouillage mémoire pour la loterie. Il devrait être possible d'utiliser une file d'attente ou une transaction Redis et d'ajouter un verrou Mysql. .
Je ne sais pas si le verrouillage de la mémoire que vous souhaitez est le suivant :
$lock = new CacheLock('key_name');
$lock->lock(); );
Le verrouillage de processus CacheLock est principalement utilisé pour l'acquisition de cache à un seul processus lorsque le cache ne parvient pas à empêcher les requêtes SQL excessives de pénétrer dans la base de données. Il est utilisé pour résoudre le contrôle de verrouillage de PHP pendant la concurrence et effectue le verrouillage inter-processus via le fichier. /eaccelerator.Sinon, utilisez eaccelerator pour traiter les verrous de fichiers et générez des verrous avec la granularité correspondante dans le répertoire correspondant. En utilisant eaccelerator, le traitement est effectué en mémoire et les performances sont relativement élevées en parallèle, similaires à la ligne. -verrous de niveau de mysql innodb.