加快我的PHP功能

时间:2017-07-10 19:45:04

标签: php mysql

我的网站上有这个代码,这个功能在每个网页上调用,但速度很慢(我做了很多研究,没有这个功能,TTFB约为100毫秒,但有了这个,它甚至可以达到2秒)。

如果在卡数据库中找到匹配项,该函数会将[]中的每个文本替换为链接。例如:[内部火灾]>>并且网站上的输出将是:

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

它工作得很好,但数据库中有3000张卡,这很慢。任何人都可以提出更好的解决方案来加快这个过程吗?

提前谢谢。

代码前的一些说明: sql_query:

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

与sql_fetch类似的功能。

char_convert:将utf-8字符转换为HTML实体(十进制)

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

如果您需要更多信息,请与我们联系。

4 个答案:

答案 0 :(得分:2)

只需2美分: 您不会同时显示3000张以上的卡片吗?那么为什么不实现一个只请求一堆(10个左右)的无限加载器,然后在用户向下滚动时请求更多?

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

解决方案2: 有另一个表格,你可以在哪个页面上存储哪些卡片,如:

cardpage(cardid, pageid)

并在cardcardpage

之间进行JOIN查询

答案 1 :(得分:2)

你可以使用MySQL自己的字符串函数在获取数据时进行替换,比在PHP中迭代要快得多:

https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

答案 2 :(得分:2)

加速此代码的最佳方法是限制需要从数据库中提取的卡数。我不打算为你编写代码,但是这里有一个如何工作的大纲:

  • 提取页面中[linked]的所有卡片名称,例如使用preg_match_all()

  • 使用WHERE name IN ('name1', 'name2', 'name3', …)执行单个SQL查询以加载所有这些卡片。

  • 循环查询结果并在适当的位置对HTML执行替换。

答案 3 :(得分:1)

您正在拨打str_replace()的3000个电话。您可以在一个中完成相同的结果。请参阅str_replace()的文档,特别是第一个和第二个参数可以是数组:

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

此外,缓存输出,以便您只需执行一次替换。