Maison >développement back-end >Problème PHP >Quelles sont les méthodes de concurrence en php
Plusieurs méthodes d'implémentation pour résoudre les problèmes de concurrence dans le développement PHP :
Recommandé : serveur php
Option 1 : Utiliser un fichier lock verrou exclusif
La fonction flock est utilisée pour acquérir le verrou de fichier. Ce verrou ne peut être acquis que par un seul thread à la fois. Les autres threads qui n'ont pas acquis le verrou sont soit bloqués, soit l'acquisition échoue <.>
Lors de l'acquisition du verrou, interrogez d'abord l'inventaire. Si l'inventaire est supérieur à 0, passez une commande, réduisez l'inventaire, puis libérez le verrou Option 2 : Utilisez le verrou pessimiste fourni. par la base de données Mysql Le moteur de stockage Innodb prend en charge les verrous au niveau de la ligne Lorsqu'une ligne de données est verrouillée, les autres processus ne peuvent pas opérer sur la ligne de données 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'attenteEnregistrez 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 Redisredis Les opérations sont toutes atomiques. Vous pouvez stocker l'inventaire du produit dans redis Avant de passer une commande, effectuez une opération de diminution sur l'inventaire si la valeur renvoyée est supérieure à ou. égal à 0, vous pouvez passer une commande. Sinon, vous ne pouvez pas passer une commande.
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }Autres problèmes de concurrence : Dans les applications réelles, dans de nombreux cas, les données seront stocké dans le cache. Lorsque le cache échoue, accédez à la base de données pour récupérer les données et réinitialisez le cache. Si la concurrence est très importante, de nombreux processus seront accédés à la base de données pour obtenir des données en même temps. dans de nombreuses requêtes pénétrant dans la base de données et provoquant le crash de la base de données, les verrous de fichiers peuvent être utilisés pour résoudre ce problème
$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); }.
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!