[請益] 使用shell_exec('grep')搜尋文字檔的問題
小弟最近在寫一個資料庫的搜尋網頁,資料是文字檔。前提是,資料檔可能隨時會更新,
而我沒有想要轉進去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的?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.92.69
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1473353416.A.FCA.html
推
09/09 08:58, , 1F
09/09 08:58, 1F
→
09/09 08:58, , 2F
09/09 08:58, 2F
→
09/09 09:08, , 3F
09/09 09:08, 3F
→
09/09 09:11, , 4F
09/09 09:11, 4F
推
09/09 09:13, , 5F
09/09 09:13, 5F
推
09/09 09:17, , 6F
09/09 09:17, 6F
→
09/09 09:36, , 7F
09/09 09:36, 7F
→
09/09 09:39, , 8F
09/09 09:39, 8F
推
09/09 09:58, , 9F
09/09 09:58, 9F
→
09/09 09:58, , 10F
09/09 09:58, 10F
→
09/09 09:59, , 11F
09/09 09:59, 11F
→
09/09 10:01, , 12F
09/09 10:01, 12F
→
09/09 10:01, , 13F
09/09 10:01, 13F
推
09/09 11:43, , 14F
09/09 11:43, 14F
→
09/09 11:43, , 15F
09/09 11:43, 15F
→
09/09 11:44, , 16F
09/09 11:44, 16F
推
09/09 13:06, , 17F
09/09 13:06, 17F
→
09/09 13:07, , 18F
09/09 13:07, 18F
→
09/09 19:32, , 19F
09/09 19:32, 19F
→
09/09 19:33, , 20F
09/09 19:33, 20F
→
09/09 19:33, , 21F
09/09 19:33, 21F
→
09/09 19:33, , 22F
09/09 19:33, 22F
PHP 近期熱門文章
PTT數位生活區 即時熱門文章