In diesem Artikel erfahren Sie, wie Sie das Problem der hohen Parallelität durch PHP-Dateisperren lösen können. Freunde, die dies benötigen, können sich auf den Inhalt dieses Artikels beziehen.
PHP-Dateisperrmethode zur Lösung des Problems der hohen Parallelität
Erstellen Sie eine neue TXT-Datei, ohne etwas in die Datei zu schreiben.
【1】Blockierungsmodus (Wartemodus): (Solange andere Prozesse die Datei gesperrt haben, wartet der aktuelle Prozess darauf, dass andere Prozesse die Datei 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
【. 2】.Nicht blockierender (Warte-)Modus: (Solange andere Prozesse die Datei gesperrt haben, wartet der aktuelle Prozess nicht darauf, dass andere Prozesse die Datei entsperren und direkt zurückkehren)
<?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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
Wenn die Verbindung zur Datenbank einige Zeit in Anspruch nimmt, finden Sie hier eine einfache kleine Demo, die intuitiver verstanden werden kann.
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 die beiden Dateien gleichzeitig aus und ändern Sie dann den Sperrmechanismus in Demo2 Sehen Sie esDer Unterschied zwischen dem blockierenden (Warte-)Modus und dem nicht blockierenden (Warte-)Modus
.
Aber dies führt dazu, dass die Warteschlange blockiert wird, bevor sie ausgeführt wird.
PHP-Dateisperre behebt hohe Parallelität
Erstellen Sie eine neue .txt-Datei, es ist nicht nötig, etwas in die Datei zu schreiben.
【1】Blockierungsmodus (Wartemodus): (Solange andere Prozesse die Datei gesperrt haben, wartet der aktuelle Prozess darauf, dass andere Prozesse die Datei 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
【. 2】.Nicht blockierender (Warte-)Modus: (Solange andere Prozesse die Datei gesperrt haben, wartet der aktuelle Prozess nicht darauf, dass andere Prozesse die Datei entsperren und direkt zurückkehren)
<?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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
Wenn die Verbindung zur Datenbank einige Zeit in Anspruch nimmt, finden Sie hier eine einfache kleine Demo, die intuitiver verstanden werden kann.
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 die beiden Dateien gleichzeitig aus und ändern Sie dann den Sperrmechanismus in Demo2 Sehen Sie esDer Unterschied zwischen dem blockierenden (Warte-)Modus und dem nicht blockierenden (Warte-)Modus
.
Aber dies führt dazu, dass die Warteschlange blockiert wird, bevor sie ausgeführt wird.
Verwandte Empfehlungen:
Lassen Sie uns über PHP-Dateisperren, gemeinsame Sperren und exklusive Sperren sprechen
Detaillierte Erklärung der Parallelität von PHP-Dateisperren Operationen
Das obige ist der detaillierte Inhalt vonDie PHP-Dateisperre behebt hohe Parallelität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!