我在数据库中保留了大量单词,我希望将文章与之匹配。我认为将这些单词保存在数组中并在需要时抓取该数组而不是每次查询数据库(因为单词不会改变那么多)会更好。
这样做有很大的性能差异吗?
如果我这样做,如何编写一个脚本将数组写入一个新的php文件。我尝试这样编写数组:
while( $row = mysql_fetch_assoc($query))
{
$newArray[] = $row;
}
$fp = fopen('noWordsArr.php', 'w');
fwrite($fp, $newArray);
fclose($fp);
但我在另一个文件中得到的只是“数组”。
所以我想我可以写这个然后写一个chron每隔几天左右就会打开文件,以防事情发生变化。但我想如果没有性能优势那么它就没有必要了,每次我需要访问这些单词时我都可以查询数据库。
答案 0 :(得分:3)
你可以像这样写一个数组:
fwrite($fp, var_export($newArray, true));
根据评论更新:
你也可以使用Bill Karwin正确建议的serialize()
功能。
答案 1 :(得分:2)
要将数据结构写入文件,请使用serialize
和unserialize
。所以:
fwrite($fp, serialize($newArray));
然后,当您检索文件时:
$newArray = unserialize(file_get_contents("noWordsArr.php"));
希望有所帮助,
谢谢, 乔
答案 2 :(得分:0)
如上所述写入文件失败的原因是fwrite()
将字符串作为参数,因此它将数组转换为字符串'Array'并写入。
您需要自己转换为字符串 - 尝试:
fwrite($fp, print_r($newArray, true));
答案 3 :(得分:0)
如果你的大多数工作只是查看列表中是否有给定的单词,那么最快的方法可能是按字母顺序存储列表并使用哈希索引。您将在临时文件中的每次更新时重建列表,并使用新生成的文件以原子方式更新旧文件。
像DJB's cdb format(也实现了in postfix)或后缀其他list formats之类的东西 - 它们都是针对快速只读查找和不常见的原子更新而优化的文件格式,我确信它们有许多其他相同概念的实现。
应用程序和列表之间的任何SQL层都只会增加开销并最终会做同样的事情(sql db将查找索引以查找单词列表中的行),只有当它更快时才会更快您使用SQL在两个物理系统之间拆分工作负载(您的应用程序在一个系统上,sql服务器在另一个系统上)。
如果列表足够小以便保存在内存中,只需从您喜欢的任何格式加载它,并将其存储在与我所谈论的索引文件等效的结构中。
另一方面,除非列表非常大或者您进行了大量查找,否则这些方法之间的性能差异可以忽略不计。
答案 4 :(得分:0)
我建议您查看一些缓存解决方案。例如,PEAR Cache_List非常易于使用,可以满足您的需求。只需将您的文字保存在文件缓存中,然后随着时间的推移或按需刷新它。