Maison >développement back-end >Problème PHP >Quelles sont les méthodes de concurrence en php

Quelles sont les méthodes de concurrence en php

尚
original
2019-10-31 13:55:512611parcourir

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'attente

Enregistrez 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

redis 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(&#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é 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(&#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);
}
.

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