[请益] 使用shell_exec('grep')搜寻文字档的问题

楼主: ioklim (Sunrise)   2016-09-09 00:50:14
小弟最近在写一个数据库的搜寻网页,资料是文字档。前提是,资料档可能随时会更新,
而我没有想要转进去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的?
作者: shadowjohn (转角遇到爱)   2016-09-09 08:58:00
grep 也有windows版的,只是你没google...但这样写,你不怕command injection吗
楼主: ioklim (Sunrise)   2016-09-09 09:08:00
grep for windows不是内建,还要安装;如果没有权限就不行了感谢S大提醒command injection,我开始怕了@@
作者: shadowjohn (转角遇到爱)   2016-09-09 09:13:00
哪需要安装,不就一个exe档而已,想唬我作好filter跟escape是不用太担心,只是你没作
楼主: ioklim (Sunrise)   2016-09-09 09:36:00
所以只要把grep.exe放在同一个目录就可以执行了,是这样吗?filter&escape...嗯,笔记中,小的新手感谢S大教学
作者: shadowjohn (转角遇到爱)   2016-09-09 09:58:00
是不用放同一个目录,但你搜寻的位置跟路径都要正确指令也可以用 c: && cd c:\book && c:\bin\grep.exe ...grep.exe "ooxx" *.exe -Ri
作者: MOONRAKER (㊣牛鹤鳗毛人)   2016-09-09 10:01:00
windows有findstr,到处都有,不用装。以前做专案就两个版本,php用grep,asp用findstr。
作者: Jerr (身为老爸老妈噜..)   2016-09-09 11:43:00
grep作者解释为什么快 有兴趣可以看一下https://lists.freebsd.org/pipermail/freebsd-current/\2010-August/019310.html
作者: shadowjohn (转角遇到爱)   2016-09-09 13:06:00
http://3wa.tw/URL/327 findstr vs grep原po要速度,findstr慢2~5倍的别用了
楼主: ioklim (Sunrise)   2016-09-09 19:32:00
感谢各位高手指点,小的获益良多。刚刚试了一下findstr,嗯,这个速度我还可以接受。自首一下耍笨,发现找不到资料的问题,根本是我自己弄错档名,哈哈。

Links booklink

Contact Us: admin [ a t ] ucptt.com