Welche Techniken gibt es für den Umgang mit Parallelität in PHP?

(*-*)浩
Freigeben: 2023-02-25 22:48:01
Original
2325 Leute haben es durchsucht

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:

Welche Techniken gibt es für den Umgang mit Parallelität in PHP?

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 wird

Die 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
}
Nach dem Login kopieren

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 Redis

Die 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{
//库存不足
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage