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

Analyse de plusieurs méthodes d'implémentation pour résoudre les problèmes de concurrence dans le développement PHP

*文
*文original
2017-12-21 16:24:131411parcourir

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 Redis

Les 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 efficace

if(redis->get(&#39;stock_num&#39;) > 0){
 stock_num = redis->decr(&#39;stock_num&#39;)
 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 concurrence est importante à ce moment-là, de nombreux processus y iront. la base de données pour récupérer des données en même temps, ce qui entraîne de nombreuses requêtes

pénétrant dans la base de données et provoquant un crash de la base de données, le verrouillage de fichier peut être utilisé pour résoudre le problème ici

$data = $cache->get(&#39;key&#39;);
if(!$data){
  $fp = fopen(&#39;lockfile&#39;);
  if(flock($fp, LOCK_EX)){
    $data = $cache->get(&#39;key&#39;);//拿到锁后再次检查缓存,这时可能已经有了
    if(!$data){
      $data = mysql->query();
      $cache->set(&#39;key&#39;, $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!

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