Datensicherheit bei hoher Parallelität
Wir wissen, dass beim Schreiben mehrerer Threads in dieselbe Datei Probleme mit der „Thread-Sicherheit“ auftreten (mehrere Threads führen gleichzeitig denselben Abschnitt aus). Der Code ist threadsicher, wenn das Ergebnis jedes Laufs mit dem eines Single-Thread-Laufs übereinstimmt und die Ergebnisse mit den Erwartungen übereinstimmen.
Wenn es sich um eine MySQL-Datenbank handelt, können Sie einen eigenen Sperrmechanismus verwenden, um das Problem zu lösen. In großen Parallelitätsszenarien wird MySQL jedoch nicht empfohlen. Bei Flash-Sales und Rush-Sales-Szenarien ist die „Überausgabe“ das kritischste Problem. Wenn dieser Aspekt nicht sorgfältig kontrolliert wird, führt dies dazu, dass die tatsächlich generierten Bestellungen höher sind als die Vorverkaufsprodukte.
Grund für die Überausgabe: (Empfohlenes Lernen: PHP-Programmierung vom Einstieg bis zur Beherrschung)
Gehen Sie davon aus, dass es sich um ein bestimmtes Eilkaufszenario handelt , wir haben insgesamt nur 100 Produkte, im letzten Moment haben wir 99 Produkte verbraucht und nur noch das letzte übrig. Zu diesem Zeitpunkt sendete das System mehrere gleichzeitige Anfragen. Die in diesen Anfragen gelesenen Produktsalden waren alle 1, und dann bestanden alle die Saldobeurteilung, was schließlich zu einer Überausgabe führte.
Es ist erwähnenswert: Denken Sie daran, das Feld „Inventarfeldnummer“ auf „unsigned“ zu setzen, da das vorzeichenlose Feld keine negative Zahl sein darf, wird „false“ zurückgegeben
Optimierungsplan
Optimierung 1: Verwenden Sie MySQL-Transaktionen, um die Zeilen von Operationen zu sperren. BEGIN ; SELECT ... FOR UPDATE ; ROLLBACK
Optimierung 2: Datei Sperridee
Für Anwendungen, bei denen die Anzahl der täglichen Besuche nicht hoch ist oder die Anzahl der Parallelität nicht sehr groß ist, ist die Verwendung normaler Dateioperationsmethoden kein Problem. Wenn jedoch die Parallelität beim Lesen und Schreiben von Dateien hoch ist, ist es sehr wahrscheinlich, dass mehrere Prozesse an der nächsten Datei arbeiten. Wenn der Zugriff auf die Datei nicht entsprechend monopolisiert wird, kommt es leicht zu Datenverlust.<?php //优化方案1:使用MySQL的事务,锁住操作的行 include('./mysql.php'); function build_order_no(){ return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); } //记录日志 function insertLog($event,$type=0){ global $conn; $sql="insert into ih_log(event,type) values('$event','$type')"; mysqli_query($conn,$sql); } mysqli_query($conn,"BEGIN"); //开始事务 $sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' FOR UPDATE";//此时这条记录被锁住,其它事务必须等待此次事务提交后才能执行 $rs=mysqli_query($conn,$sql); $row=$rs->fetch_assoc(); if($row['number']>0){ //生成订单 $order_sn=build_order_no(); $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; $order_rs=mysqli_query($conn,$sql); //库存减少 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'"; $store_rs=mysqli_query($conn,$sql); if($store_rs){ echo '库存减少成功'; insertLog('库存减少成功'); mysqli_query($conn,"COMMIT");//事务提交即解锁 }else{ echo '库存减少失败'; insertLog('库存减少失败'); } }else{ echo '库存不够'; insertLog('库存不够'); mysqli_query($conn,"ROLLBACK"); }
Das obige ist der detaillierte Inhalt vonWie man mit hoher Parallelität in PHP umgeht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

MantisBT
Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

VSCode Windows 64-Bit-Download
Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

Dreamweaver Mac
Visuelle Webentwicklungstools

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor
