Heim >Backend-Entwicklung >PHP-Tutorial >PHP verwendet Dateisperren, um Probleme mit hoher Parallelität zu lösen

PHP verwendet Dateisperren, um Probleme mit hoher Parallelität zu lösen

零到壹度
零到壹度Original
2018-03-27 10:05:112390Durchsuche

Dieses Mal werde ich Ihnen die Verwendung von Dateisperren durch PHP zur Lösung von Problemen mit hoher Parallelität vorstellen. Hier sind praktische Fälle.

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 darauf, dass andere Prozesse die Datei entsperren Datei)

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

[2].Nicht blockierender (Warte-)Modus: (Solange andere Prozesse die Datei gesperrt haben, wird der aktuelle Prozess dies tun Warten Sie nicht, bis andere Prozesse die Datei direkt entsperren. Zurück)

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

Wenn die Verbindung zur Datenbank einige Zeit in Anspruch nimmt, finden Sie unten eine einfache Demo für ein intuitiveres Verständnis.

   demo.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);
demo2.php
<?php
$fp = fopen("file_lock.txt", "r");
// 加锁(如果改成flock($fp, LOCK_EX | LOCK_NB),demo2.php会直接返回2,否则会等待demo.php执行完返回1)
if(flock($fp, LOCK_EX))
{    echo 1;
} else {   
 echo 2;
}
//关闭文件
fclose($fp);

Führen Sie zwei Dateien gleichzeitig aus und ändern Sie dann den Sperrmechanismus in Demo2. Sie können den Blockierungs- (Warte-) Modus und nicht blockierend Der Unterschied zwischen (Warte-)Modus .

Aber dies führt dazu, dass die Warteschlange blockiert wird. Wenn 10 Personen gleichzeitig in die Datenbank schreiben, wird sie blockiert ausgeführt vor der Ausführung!

Das obige ist der detaillierte Inhalt vonPHP verwendet Dateisperren, um Probleme mit hoher Parallelität zu lösen. 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