Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Schritte zur Verwendung von Dateisperren zur Lösung von Problemen mit hoher Parallelität in PHP

Detaillierte Erläuterung der Schritte zur Verwendung von Dateisperren zur Lösung von Problemen mit hoher Parallelität in PHP

php中世界最好的语言
php中世界最好的语言Original
2018-05-17 13:47:502014Durchsuche

Dieses Mal werde ich Ihnen eine detaillierte Erklärung der Schritte geben, die PHP zur Verwendung von Dateisperren zur Lösung hoher Parallelität benötigt Ein praktischer Fall, werfen wir einen Blick darauf. Erstellen Sie eine neue TXT-Datei, ohne etwas in die Datei zu schreiben.

【1】. Blockierungs-(Warte-)Modus : (Solange andere Prozesse die Datei gesperrt haben, wartet der aktuelle Prozess auf andere Prozesse um die Datei zu entsperren )

<?php
//连接数据库
$con=mysqli_connect("192.168.2.186","root","root","test");
//查询商品数量是否大于0,大于0才能下单,并减少库存
$fp = fopen("lock.txt", "r");
//加锁
if(flock($fp,LOCK_EX))
{
  $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));
  if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1 WHERE id=1&#39;);}
  //执行完成解锁
  flock($fp,LOCK_UN);
}
//关闭文件
fclose($fp);
unset($res);
mysqli_close($con);
?>

【2】 Nicht blockierender (Warte-)Modus : (Solange andere Prozesse gesperrt sind Die Datei wird vom aktuellen Prozess nicht geöffnet. Er wartet darauf, dass andere Prozesse die Datei entsperren und direkt zurückkehren Verständnis. demo.php

<?php
//连接数据库
$con=mysqli_connect("192.168.2.186","root","root","test");
//查询商品数量是否大于0,大于0才能下单,并减少库存
$fp = fopen("lock.txt", "r");
//加锁
if(flock($fp,LOCK_EX | LOCK_NB))
{
  $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));
  if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1 WHERE id=1&#39;);}
  //执行完成解锁
  flock($fp,LOCK_UN);
}
//关闭文件
fclose($fp);
unset($res);
mysqli_close($con);
?>

demo2.php

<?php
$fp = fopen("file_lock.txt", "r");
// 加锁
if(flock($fp, LOCK_EX))
{
  sleep(10);
  echo 1;
  //执行完成解锁
  flock($fp,LOCK_UN);
} else {
  echo 2;
}
//关闭文件
fclose($fp);

Führen Sie zwei Dateien gleichzeitig aus und ändern Sie dann den Sperrmechanismus in Demo2. Sie können die Blockierung (Warten) sehen )-Modus und Der Unterschied zwischen dem nicht blockierenden (Warte-)Modus.

Aber dies führt dazu, dass die Warteschlange blockiert wird, bevor sie ausgeführt wird.

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Detaillierte Erläuterung der Verwendung des PHP-Decorator-Modus

Detaillierte Erläuterung der Schritte zum dynamischen Abrufen Funktionsparameter in PHP

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Schritte zur Verwendung von Dateisperren zur Lösung von Problemen mit hoher Parallelität in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn