2017-07-10 2 views
-1

Ich habe diesen Code auf meiner Website, diese Funktion wird auf jeder Webseite aufgerufen, aber es ist langsam (ich habe eine Menge Forschung und ohne diese Funktion der TTFB ist etwa 100ms, aber damit kann es sein sogar 2 Sekunden).Beschleunigen Sie meine PHP-Funktion

Die Funktion ersetzt jeden Text in [] zu einem Link, wenn eine Übereinstimmung in der Kartendatenbank gefunden wird. Z.B .: [Inneres Feuer] >> und die Ausgabe auf der Website wird:

<a href/card/id/name" class="quality1">Inner Fire</a> 

Es ist wirklich toll funktioniert, aber es gibt 3000 Karten in der Datenbank und das ist langsam. Jeder kann eine bessere Lösung finden, um den Prozess zu beschleunigen?

Vielen Dank im Voraus.

Einige Erklärungen vor dem Code: sql_query:

function sql_query($conn, $query) 
{ 
    return mysqli_query($conn, $query); 
} 

ähnliche Funktion mit sql_fetch.

char_convert: wandelt utf-8-Zeichen in HTML-Entität (dezimal)

function coloredcard($text) 
{ 
    global $conn; 
    $query = "SELECT id, quality, name, collectible FROM cards"; 
    $result = sql_query($conn, $query); 
    while ($card = sql_fetch($result)) 
    { 
     $name_replace = strtolower(str_replace(str_split("\' "), "-", $card['name'])); 
     if ($card['collectible']!=0) //if collectible, replace [card_names] 
     { 
      $from = '['.char_convert($card['name']).']'; 
      $to = '<a href="/card/'.$card['id'].'/'.$name_replace.'" class="quality'.$card['quality'].'">'.$card['name'].'</a>'; 
      $text = str_ireplace($from, $to, $text); 
     } 
     elseif ($card['collectible']==0) //if not collectible replace (noncollectible card names) 
     { 
      $from = '('.char_convert($card['name']).')'; 
      $to = '<a href="/card/'.$card['id'].'/'.$name_replace.'" class="quality'.$card['quality'].'">'.$card['name'].'</a>'; 
      $text = str_ireplace($from, $to, $text); 
     } 
    } 
    return $text; 
} 

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Antwort

2

Der beste Weg, diesen Code zu beschleunigen wird die Anzahl der zu begrenzen Karten, die aus der Datenbank geholt werden müssen. Ich werde nicht den Code für Sie schreiben, aber hier ist eine übersicht der Güter, wie das funktionieren könnte:

  • Extract alle Kartennamen, die [linked] in der Seite sind, z.B. mit preg_match_all().

  • Führen Sie eine einzelne SQL-Abfrage zum Laden aller dieser Karten mit WHERE name IN ('name1', 'name2', 'name3', …) aus.

  • Wiederholen Sie das Ergebnis dieser Abfrage, und führen Sie gegebenenfalls im HTML-Code Ersetzungen durch.

+0

Dies ist wahrscheinlich die beste Antwort. Sieht wirklich toll aus. – Joey

+0

Können Sie mir ein bisschen mehr helfen? Es funktioniert großartig, aber ich habe ein kleines Problem. Mein preg_match_all sieht folgendermaßen aus:/\ [([^ \]] *) \] /, aber wenn jemand [[inneres Feuer] eintippt) macht es [inneres Feuer], anstatt es [inneres Feuer] zu machen. Warum entfernt es die beiden vom Ende, aber entfernt eines von Anfang an? Ich möchte es unter allen Umständen entfernen. – Joey

2

Nur meine 2 Cent: Sie werden nicht 3000+ Karten zur gleichen Zeit anzeigen, oder? Warum also nicht einen unendlichen Loader implementieren, der nur ein paar davon anfordert (10 oder so) und dann nach mehr verlangt, wenn der Benutzer runterscrollt?

$query = "SELECT id, quality, name, collectible FROM cards LIMIT ".$offset.",10"; 

Lösung Nr.2: eine andere Tabelle, in dem Sie speichern, welche Karten auf der Seite benötigt werden, so etwas wie:

cardpage(cardid, pageid) 

und eine Abfrage zwischen card und cardpage Tabellen JOIN haben

+0

Natürlich nicht. Einige Seiten haben noch keine [] verwendet, manche Seiten haben etwa 5 oder 10, die ersetzt werden müssen. – Joey

+0

"unendlich loader": Niemals so etwas zuvor benutzt, aber es wird überprüft. – Joey

+0

also haben Sie eine Tabelle, in der Sie speichern, welche Karten benötigt werden und eine JOIN-Abfrage zwischen Karten und einer solchen Tabelle haben. Bitte überprüfen Sie meine Bearbeitung –

1

Sie machen 3000 Anrufe an str_replace(). Sie können das gleiche Ergebnis in einem erzielen. Lesen Sie die Dokumentation für str_replace(), vor allem, dass die ersten und zweiten Parameter-Arrays sein können:

$search = ['things', 'to', 'search', 'for', ... ]; 
$replace = ['things', 'to', 'replace', 'with', ... ]; 
$output = str_replace($search, $replace, $input); 

Auch die Ausgabe-Cache, so dass Sie nur einmal den Ersatz leisten müssen.