Maison >développement back-end >tutoriel php >Analyse de plusieurs méthodes d'implémentation pour résoudre les problèmes de concurrence dans le développement PHP
Les exemples de cet article décrivent plusieurs méthodes d'implémentation pour résoudre les problèmes de concurrence dans le développement PHP et sont partagés avec tout le monde pour votre référence.
Dans des scénarios simultanés tels que l'achat précipité d'un produit, une survente peut se produire. À l'heure actuelle, il est nécessaire de résoudre les problèmes causés par la concurrence.
Il n'y a pas de disposition native dans les solutions de concurrence en langage PHP. nécessitent d’autres moyens pour réaliser le contrôle de concurrence.
Option 1 : Utiliser le verrouillage exclusif du verrouillage de fichier
La fonction flock est utilisée pour obtenir le verrouillage du fichier. ne peut être acquis que par un seul thread, les autres threads qui n'ont pas acquis le verrou bloqueront ou ne parviendront pas à acquérir le verrou
Lors de l'acquisition du verrou, interrogez d'abord l'inventaire. Si l'inventaire est supérieur à 0, placez-le. une commande et réduire l'inventaire. Puis relâchez le verrou
Option 2 : Utiliser le verrou pessimiste fourni par la base de données Mysql
Le moteur de stockage Innodb prend en charge les verrous au niveau des lignes. Lorsque les données de ligne sont verrouillées, les autres processus ne peuvent pas fonctionner sur les données de ligne.
Interrogez et verrouillez d'abord la ligne :
select stock_num from table where id=1 for update if(stock_num > 0){ //下订单 update table set stock_num=stock-1 where id=1 }
<.>
Option 3 : Utiliser la file d'attente
Stockez les demandes de commande de l'utilisateur dans une file d'attente dans l'ordre et utilisez un processus distinct en arrière-plan pour traiter les demandes de commande dans la file d'attente Option 4 : Utiliser RedisLes opérations Redis sont toutes atomiques. Vous pouvez stocker l'inventaire des marchandises dans Redis avant de passer une commande, effectuez une opération de diminution sur l'inventaire si la valeur retournée est supérieure ou supérieure. égal à 0, vous pouvez passer une commande. Sinon, vous ne pouvez pas passer de commande. De cette façon Très efficaceif(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }
$data = $cache->get('key'); if(!$data){ $fp = fopen('lockfile'); if(flock($fp, LOCK_EX)){ $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了 if(!$data){ $data = mysql->query(); $cache->set('key', $data); } flock($fp, LOCK_UN); } fclose($fp); }Pour parler franchement, le verrouillage est nécessaire pour résoudre les problèmes de concurrence. L'essence de diverses solutions est le verrouillage
Lecture connexe :
Apprentissage et application MySQL Redis
Implémentation du mécanisme de transaction Redis et de la méthode de verrouillage optimiste
Optimisation de la base de données MySQL (3) - Verrouillage pessimiste et optimiste MySQL (contrôle de concurrence)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!