我的网站上有这个代码,这个功能在每个网页上调用,但速度很慢(我做了很多研究,没有这个功能,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;
}
如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
只需2美分: 您不会同时显示3000张以上的卡片吗?那么为什么不实现一个只请求一堆(10个左右)的无限加载器,然后在用户向下滚动时请求更多?
$query = "SELECT id, quality, name, collectible FROM cards LIMIT ".$offset.",10";
解决方案2: 有另一个表格,你可以在哪个页面上存储哪些卡片,如:
cardpage(cardid, pageid)
并在card
和cardpage
表
答案 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);
此外,缓存输出,以便您只需执行一次替换。