2017-07-10 2 views
-1

私のウェブサイトにこのコードがありますが、この関数はすべてのWebページで呼び出されますが、遅いです(私は多くの研究を行い、この関数を使わないとTTFBは約100msですが、 2秒さえ)。私のPHP関数をスピードアップ

この機能は、カードデータベースに一致するものが見つかった場合、[]内のすべてのテキストをリンクに置き換えます。例えば:[インナー炎] >>ウェブサイト上の出力は次のようになります。それは本当に素晴らしい働いているが、3000枚のカードがデータベースに存在し、これが遅い

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

。誰でもプロセスをスピードアップするためのより良いソリューションを考え出すことができますか?

ありがとうございます。

コードの前にいくつかの明確化: sql_query:

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

sql_fetchと同様の機能。

char_convert:HTMLエンティティ(10進数)

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; 
} 

にUTF-8文字に変換しますが、さらに情報が必要な場合は私に知らせてください。

答えて

2

の数を制限することで、このコードを加速するための最良の方法データベースからフェッチする必要のあるカード。私はあなたのためのコードを記述するつもりはないが、ここではそれが仕事ができるかの概要を以下に示します。

  • は、例えば、ページ内の[linked]あるすべてのカード名を抽出しますpreg_match_all()を使用してください。

  • WHERE name IN ('name1', 'name2', 'name3', …)を使用して、すべてのカードをロードする単一のSQLクエリを実行します。

  • そのクエリの結果をループし、必要に応じてHTML上で置換を実行します。

+0

これはおそらく最高の答えです。本当に素晴らしいですね。 – Joey

+0

もう少しお手伝いできますか?それは素晴らしい仕事ですが、私は小さな問題があります。私のpreg_match_allは/ \ [([^ \]] *)\] /のように見えますが、[[Inner Fire]]と入力すると[Inner Fire]になります。なぜそれが最後から2つを取り除くのですか?]最初から削除しますか?私はそれをすべての状況で取り除きたい。 – Joey

2

ちょうど私の2セント: 同時に3000以上のカードを表示するつもりはありませんか?だから、なぜそれらの束(10程度)を要求し、ユーザーがスクロールするにつれてより多くを求める無限のローダーを実装しないのですか?

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

ソリューション2番: は、何かあなたがどのページに必要とされているカードを保管している別のテーブルを持っている:

cardpage(cardid, pageid) 

をしてcardcardpageテーブル間のJOINのクエリを持っています

+0

もちろんです。一部のページには[]が使用されていないページもありますが、一部のページには5または10程度のページが必要です。 – Joey

+0

「無限ローダー」:これまでのようなものは一度も使用しませんでしたが、チェックアウトします。 – Joey

+0

このように、必要なカードを格納し、カードとそのようなテーブルの間にJOINクエリを持つテーブルを用意してください。 –

1

str_replace()に3000コールを発信しています。同じ結果を1つにまとめることができます。第1及び第2のパラメータを配列することができ、特にこと、str_replace()のためのドキュメントを参照してください。

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

また、あなたは一度だけの交換を行うためにあるように、出力をキャッシュします。

関連する問題