Maison  >  Article  >  développement back-end  >  Découverte de cas de plusieurs méthodes d'implémentation pour résoudre des problèmes de concurrence dans le développement PHP

Découverte de cas de plusieurs méthodes d'implémentation pour résoudre des problèmes de concurrence dans le développement PHP

jacklove
jackloveoriginal
2018-05-22 18:01:131422parcourir

Cet article explique la découverte 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. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :

Dans des scénarios simultanés tels que l'achat précipité de produits, des phénomènes de survente peuvent survenir. À ce stade, ces problèmes causés par la concurrence doivent être résolus

.

Il n'existe pas de solution de concurrence native dans le langage PHP, d'autres méthodes sont donc nécessaires 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 acquérir le verrouillage de fichier. Ce verrou ne peut être acquis que par un seul thread à la fois. acquis, le verrou sera bloqué. , ou 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 : Utiliser la base de données Mysql Le verrou pessimiste fourni

Le moteur de stockage Innodb prend en charge le verrouillage 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'attente

pour stocker 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 la file d'attente Demande de commande dans

Option 4 : utiliser Redis

Toutes les opérations Redis sont atomiques. dans redis, et effectuez une opération de diminution sur l'inventaire avant de passer une commande. Si la valeur renvoyée est supérieure ou égale à 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ées dans le cache . Lorsque le cache échoue, accédez à la base de données pour récupérer les données et réinitialiser le cache. Si la quantité de concurrence est importante à ce moment-là, de nombreux processus récupéreront les données de la base de données en même temps, ce qui entraînera 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.

Cet article explique comment résoudre la concurrence dans le développement PHP. Plusieurs cas de méthodes d'implémentation du problème ont été trouvé. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois.

Recommandations associées :

Comment résoudre le problème selon lequel les données interrogées par php sont tronquées et le code chinois devient Unicode lors de la conversion en json ?


Explication des exemples de traversée de tableaux PHP


Explication des exemples de classification et de création de tableaux PHP

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn