Heim > Backend-Entwicklung > PHP-Tutorial > Bitte, Parallelitätshelden, geben Sie mir eine Lösung ...

Bitte, Parallelitätshelden, geben Sie mir eine Lösung ...

WBOY
Freigeben: 2016-08-18 09:15:53
Original
955 Leute haben es durchsucht

Da es einen Code gibt, der While-Schleifencode verwendet, schlägt dieser fehl, sobald die Datenmenge groß ist....

while($rows = $query->fetch_array()){

<code>if($rows['mingxi_1']=='1'){
    $ds = Ssc_Ds($rs['ball_1']);
    $dx = Ssc_Dx($rs['ball_1']);
    if($rows['mingxi_2']==$rs['ball_1'] || $rows['mingxi_2']==$ds || $rows['mingxi_2']==$dx){
     
        $msql="update c_bet set js=1 where id='".$rows['id']."'";
        $mysqli->query($msql) or die ("修改订单状态失败!!!".$rows['id']);
        //给会员账户增加奖金
        $msql="update k_user set money=money+".$rows['win']." where uid=".$rows['uid']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }else{
        //注单未中奖,修改注单内容
        $msql="update c_bet set win=0,js=1 where id=".$rows['id']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }
}</code>
Nach dem Login kopieren
Nach dem Login kopieren

Antwortinhalt:

Da es einen Code gibt, der While-Schleifencode verwendet, schlägt dieser fehl, sobald die Datenmenge groß ist....

while($rows = $query->fetch_array()){

<code>if($rows['mingxi_1']=='1'){
    $ds = Ssc_Ds($rs['ball_1']);
    $dx = Ssc_Dx($rs['ball_1']);
    if($rows['mingxi_2']==$rs['ball_1'] || $rows['mingxi_2']==$ds || $rows['mingxi_2']==$dx){
     
        $msql="update c_bet set js=1 where id='".$rows['id']."'";
        $mysqli->query($msql) or die ("修改订单状态失败!!!".$rows['id']);
        //给会员账户增加奖金
        $msql="update k_user set money=money+".$rows['win']." where uid=".$rows['uid']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }else{
        //注单未中奖,修改注单内容
        $msql="update c_bet set win=0,js=1 where id=".$rows['id']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }
}</code>
Nach dem Login kopieren
Nach dem Login kopieren

1. Können Sie die Vollversion des Codes hochladen? Zögern Sie, SQL herauszunehmen?
2. Eine visuelle Überprüfung zeigt, dass zu viele SQL-Ergebnismengen vorhanden sind, der Speicher möglicherweise überläuft und der Vorgang zeitaufwändig ist.
3 Lösung: Verwenden Sie die Redis-Warteschlange oder die MySQL-Warteschlange, um das Problem zu lösen.

Die Schleifenoperation darf im Programm nicht so geschrieben werden. . . Sie können eine neue SQL-Tabelle als Warteschlange erstellen oder Redis direkt als Warteschlange verwenden. . Öffnen Sie dann einen neuen Dienst oder ein neues Skript, um diese Aufgabe speziell zu erledigen

Es wird geschätzt, dass die Verarbeitungsgeschwindigkeit zu langsam ist, was dazu führt, dass der Server nicht auf neue Anfragen reagieren kann, was zu einem Ausfall führt. Dem Code nach zu urteilen, liegt ein Problem mit Ihrem Verarbeitungsmodell vor. Es ist am besten, keine Schleife zu verwenden, um das Problem nach Möglichkeit zu lösen.

Ihre $rs sollte ein großes Array sein und Sie verwenden eine MySQL-Abfrage in der Schleife, was sehr ineffizient sein wird.
Es wird empfohlen, ein PHP im CLI-Modus für die asynchrone Verarbeitung auszuführen

Ich möchte keine Warteschlangen verwenden, um Ihnen eine sehr einfache und heftige Idee mit mehreren Prozessen zu vermitteln

Die größte Abfrageergebnismenge wird basierend auf dem Modulo der ID in mehrere Prozesse aufgeteilt. Die Idee ähnelt dem folgenden Pseudocode

<code>        for ($i=1;$i<=100;$i++){

            if($i%5==0){
                echo 'mod 1 : '.$i.'<br>';
            }
            if($i%5==1){
                echo 'mod 2 : '.$i.'<br>';
            }
            if($i%5==2){
                echo 'mod 3 : '.$i.'<br>';
            }
            if($i%5==3){
                echo 'mod 4 : '.$i.'<br>';
            }
            if($i%5==4){
                echo 'mod 5 : '.$i.'<br>';
            }

        }</code>
Nach dem Login kopieren

Multiplizieren und teilen Sie alle IDs basierend auf der Datenmenge auf, oder ob Sie 5 PHP-Prozesse direkt öffnen und bei der Abfrage von SQL-Anweisungen aufteilen, hängt von Ihrer Geschäftslogik ab.

Die in 5 Prozesse aufgeteilte SQL-Anweisung ähnelt der folgenden:

<code>SELECT * FROM member where member_id%5=0;
SELECT * FROM member where member_id%5=1;
SELECT * FROM member where member_id%5=2;
SELECT * FROM member where member_id%5=3;
SELECT * FROM member where member_id%5=4;</code>
Nach dem Login kopieren

Sie können while(1){
verwenden, um einen Teil der Daten auf einmal zur Verarbeitung herauszunehmen und dann aus der Schleife auszubrechen, nachdem die Verarbeitung stapelweise abgeschlossen ist
}

Verwandte Etiketten:
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