Vor einiger Zeit gab es die Forderung: Kunden reichen ein einfaches Formular ein, um eine H5-Seite für Rubbellosaktivitäten zu erstellen, die für alle Endgeräte (PC, Pad, Phone) geeignet ist und die Funktion beinhaltet, dass Kunden ein Limit von 60.000 generieren können Preiscodes online.
Da wir den Preiscode jeder Veranstaltung einzigartig halten müssen, bereiten wir uns zunächst darauf vor, die Uniqid-Funktion von PHP zu verwenden, um eine UUID (Universally Unique IDentifier, auch GUID genannt, eine global eindeutige Kennung, die eine von einem Algorithmus generierte eindeutige Kennung ist) zu generieren erzeugen.
Aber als wir früher 1W zum Testen generierten, stellten wir fest, dass es mehrere zehn Sekunden dauerte, etwas zu generieren, ohne die Zeit zum Einfügen in die Datenbank. Dann haben wir ein einfaches Beispiel mit xhprof für Leistungstests geschrieben
1 2 3 4 5 6 7 8 9 10 |
|
Testergebnisse:
1 2 3 4 5 6 7 |
|
Die Generierung dauert tatsächlich fast 40 Sekunden. Eine einzelne Ausführung dauert 3969 Mikrosekunden, was 0,003969 Sekunden entspricht. Wenn der Benutzer das Formular abschickt und gleichzeitig einen Einlösungscode generiert, dauert es im schlimmsten Fall 4 Minuten, bis er dem Benutzer antwortet. Natürlich kann er auch asynchron über die Nachrichtenwarteschlange generiert werden, aber warum dauert das bei Uniqid? viel Zeit, um eine einfache Zeichenfolge zu generieren?
Überprüfen Sie dann den Implementierungsquellcode von uniqid. Der Code ist unten aufgeführt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
Wenn man sich die Logik ansieht, gibt es keine komplizierten Vorgänge in der aktuellen Zeit Sekunden und Mikrosekunden, und dann schreibe ich einen einfachen Test
1 2 3 4 5 6 7 8 9 |
|
und es dauert 2000 Mikrosekunden, um 1W mal auszuführen. Warum ist das so? Wir haben jedoch festgestellt, dass es in der generierten UID viele Duplikate gab, daher haben wir auf die Funktion usleep im Originalcode geachtet.
Beim Hinzufügen der Funktion usleep im Test dauerte es dieses Mal fast 40 Sekunden, bis sie mit der UID übereinstimmte Das PHP-Ergebnis dient dazu, die generierte UID jedes Mal unterschiedlich zu halten.
Das Problem ist in der Funktion „usleep“ aufgetreten. Fügen Sie dann die Intervallzeit vor und nach „usleep“ hinzu. Der Code lautet wie folgt:
1 2 3 4 5 6 7 |
|
Schließlich wurde festgestellt, dass die Generierung 39,99587739,995877 Sekunden dauert Der 1W-Preiscode und die gesamte Usleep-Intervallzeit betragen 39,982442 m. Durch das Drucken der Usleep-Zeit haben wir festgestellt, dass usleep(1) jedes Mal 4000 Mikrosekunden von der Prozessunterbrechung bis zum Aufwachen benötigt. Wir wussten bereits, dass usleep die Genauigkeit nicht erreichen konnte , und der Unterschied war zu groß.
Schließlich wurde der folgende Code verwendet, um den Preiscode zu generieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
Kommt mit UUID-Testcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|