小弟最近在写一个数据库的搜寻网页,资料是文字档。前提是,资料档可能随时会更新,
而我没有想要转进去MySQL数据库,觉得有点麻烦。
我尝试了几种搜寻的方式:
***方法1***
资料档是近300Mb的TXT档,BIG5编码
把原始档案拆成三十多个档,用ajax请求php,php是用:
foreach(file($filename) as $fli=>$fl){
if(mb_stripos($fl, $needle,0,"UTF-8")!==false){
//找到资料的处理...
}
}
这个方法搜寻一次费时约12-15秒左右
***方法2***
先把资料档案优化成TAB分字段的文字档,大小剩下一个42Mb的档案
直接用SplFileObject()逐行比对关键字:
$file = new SplFileObject($filename);
while (!$file->eof()) {
$fl = $file->fgets();
if(mb_stripos($fl, $needle,0,"UTF-8")!==false){
//找到资料的处理...
}
}
这个方式搜寻并没有比较快,一次也费时约12-15秒左右
***方法3***
再把档案每行先处理过,留下含有关键字部份当作索引档,
然后再用方法2的方式搜寻,得到行数再回传此行数的原始档那行资料,
本来想说搜寻的文字档小约剩下1/3,可以加速搜寻速度,
结果出乎意料的,这方式并没有快多少,大概只差1秒。
***方法4***
Google爬了一下文,有人推荐用shell_exec呼叫Linux内建的grep搜寻功能,果然用这方
式搜寻速度飞快,约0.3秒就搜寻完毕了。
$strResult = shell_exec('grep -i "'.$needle.'" '.$filename);
$aResult = explode("\n",$strResult);
foreach($aResult as $key => $value){
//找到资料的处理...
}
但是问题来了,
#问题1:除错困难
当我尝试把这方法应用到其他资料档的时候,发现某些关键字明明有资料,使用方法1-3都
找得到,但是使用方法4就是找不到,不知道该怎么debug。
而且搜寻关键字用英文比较会有问题,中文就没事。
#问题2:网站移植困难
如果要把网站移到非linux架的主机上,就没有办法用方法4了,不知道有没有php内建的
搜寻功能,效能可以比拟linux的grep的?