Heim > Artikel > Backend-Entwicklung > Welche Techniken gibt es für den Umgang mit Parallelität in PHP?
Die Beispiele in diesem Artikel beschreiben verschiedene Implementierungsmethoden zur Lösung von Parallelitätsproblemen in der PHP-Entwicklung. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
In gleichzeitigen Szenarien wie Produkt-Eilkäufen, Überverkauft kann ein Phänomen auftreten, dann müssen Sie die durch Parallelität verursachten Probleme lösen
Es gibt keine native Parallelitätslösung in der PHP-Sprache, daher müssen Sie andere Methoden verwenden, um die Parallelitätskontrolle zu erreichen.
Option 1: Exklusive Sperre für Dateisperre verwenden (Empfohlenes Lernen: PHP-Video-Tutorial)
Die Flock-Funktion wird verwendet, um die Dateisperre zu erhalten . Diese Sperre kann nur von einem Thread gleichzeitig erworben werden. Andere Threads, die die Sperre nicht erhalten haben, sind entweder blockiert oder konnten sie nicht erwerben. Fragen Sie beim Erwerb der Sperre zunächst ab Der Lagerbestand ist größer als 0, geben Sie eine Bestellung auf, reduzieren Sie den Lagerbestand und heben Sie dann die Sperre auf
Option 2: Verwenden Sie die pessimistische Sperre, die von der MySQL-Datenbank bereitgestellt wirdDie Innodb-Speicher-Engine unterstützt Sperren auf Zeilenebene. Wenn eine Datenzeile gesperrt ist, können andere Prozesse diese Datenzeile nicht bearbeiten.
Fragen Sie zuerst die Zeile ab und sperren Sie sie:
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: Verwenden Sie eine Warteschlange
, um die Bestellanfragen des Benutzers zu übertragen. Die Bestellanfragen werden der Reihe nach in einer Warteschlange gespeichert, und im Hintergrund wird ein separater Prozess verwendet, um die Bestellanfragen in der Warteschlange zu verarbeiten
Option 4: Verwenden Sie RedisDie Operationen von Redis sind alle atomar. Sie können den Warenbestand in Redis speichern, bevor Sie eine Bestellung aufgeben auf dem Inventar. Wenn der zurückgegebene Wert größer oder gleich 0 ist, können Sie eine Bestellung aufgeben.
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }Andere Parallelitätsprobleme:
In vielen Fällen werden Daten im Cache gespeichert. Wenn der Cache ausfällt, rufen Sie die Datenbank auf, um die Daten abzurufen, und setzen Sie den Cache zurück ist sehr groß und es werden viele Prozesse gleichzeitig an die Datenbank gehen, um Daten abzurufen, was dazu führt, dass viele Anfragen
in die Datenbank eindringen und zum Absturz der Datenbank führen. Zur Lösung können Dateisperren verwendet werden Dieses Problem
$data = $cache->get('key'); if(!$data){ $fp = fopen('lockfile'); if(flock($fp, LOCK_EX)){ $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了 if(!$data){ $data = mysql->query(); $cache->set('key', $data); } flock($fp, LOCK_UN); } fclose($fp); }
Um es ganz klar auszudrücken: Sperren ist notwendig, um Parallelitätsprobleme zu lösen. Das Wesentliche verschiedener Lösungen ist das Sperren.
Das obige ist der detaillierte Inhalt vonWelche Techniken gibt es für den Umgang mit Parallelität in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!