Heim  >  Artikel  >  Backend-Entwicklung  >  MySQL - PHP-Parallelitätsverarbeitung?

MySQL - PHP-Parallelitätsverarbeitung?

WBOY
WBOYOriginal
2016-08-04 09:20:53902Durchsuche

Ich möchte eine Zahlungsschnittstelle für Drittanbieter erstellen, befürchte jedoch, dass es bei der Auftragserteilung zu Parallelität kommen könnte.

<code><?php

$fp = fopen('test.txt', 'r');

$try = 10;

do{
    $lock = flock($fp,LOCK_EX);//独占锁
    //没有获得锁释放cpu重新获取
    if(!lock){
        usleep(50000);  //0.05
    }
}while(!$lock && --$try > 0);

if($lock){

    /***********拿到锁的用户执行********/

    //在这里生成订单号,写入数据库, 跳转到支付页面.....

    flock($fp,LOCK_UN);
    fclose($fp);
}else{
    fclose($fp);
    die("系统繁忙,稍后再试");
}</code>

Ich habe den obigen Code im Internet gefunden und ihn geändert. Ich habe immer das Gefühl, dass er etwas schwach ist. Ich weiß nicht, ob er funktionieren wird oder ob Sie bessere Vorschläge haben?

Antwortinhalt:

Ich möchte eine Zahlungsschnittstelle für Drittanbieter erstellen, befürchte jedoch, dass es bei der Auftragserteilung zu Parallelität kommen könnte.

<code><?php

$fp = fopen('test.txt', 'r');

$try = 10;

do{
    $lock = flock($fp,LOCK_EX);//独占锁
    //没有获得锁释放cpu重新获取
    if(!lock){
        usleep(50000);  //0.05
    }
}while(!$lock && --$try > 0);

if($lock){

    /***********拿到锁的用户执行********/

    //在这里生成订单号,写入数据库, 跳转到支付页面.....

    flock($fp,LOCK_UN);
    fclose($fp);
}else{
    fclose($fp);
    die("系统繁忙,稍后再试");
}</code>

Ich habe den obigen Code im Internet gefunden und ihn geändert. Ich habe immer das Gefühl, dass er etwas schwach ist. Ich weiß nicht, ob er funktionieren wird oder ob Sie bessere Vorschläge haben?

  1. Sie können die atomare Zeilenoperation von Redis verwenden, um das Sperren zu implementieren und einen Schlüssel als Markierung festzulegen.

  2. Sie können dazu nmq verwenden.

  1. Das Poster fügt eine exklusive Sperre über eine Datei hinzu. Bedeutet dies, dass bei jeder Bestellung zuerst die Sperre abgerufen und dann die Bestellung erstellt wird? Bei einer Serienoperation kann das TPS für die Bestellung erbärmlich sein

  2. Der Autor erwähnte die Parallelität, weil der Benutzer zweimal auf die Bestellschaltfläche geklickt hat, was zu wiederholten Bestellungen führte. Wenn ja, gibt es viele Lösungen für dieses Szenario? Welche garantierte Idempotenz kann Ihr Problem sein? gelöst werden durch requestId/token

Es ist nicht erforderlich, eine Sperre im Programm festzulegen. Erstellen Sie einfach einen eindeutigen Index in der Datenbank, damit die Leistung optimal ist.

Redis-Sperre verwenden

swoole mysql

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