[請益] 使用shell_exec('grep')搜尋文字檔的問題

看板PHP作者 (Sunrise)時間8年前 (2016/09/09 00:50), 編輯推噓6(6016)
留言22則, 4人參與, 最新討論串1/1
小弟最近在寫一個資料庫的搜尋網頁,資料是文字檔。前提是,資料檔可能隨時會更新, 而我沒有想要轉進去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
grep 也有windows版的,只是你沒google...
09/09 08:58, 1F

09/09 08:58, , 2F
但這樣寫,你不怕command injection嗎
09/09 08:58, 2F

09/09 09:08, , 3F
grep for windows不是內建,還要安裝;如果沒有權限就不行了
09/09 09:08, 3F

09/09 09:11, , 4F
感謝S大提醒command injection,我開始怕了@@
09/09 09:11, 4F

09/09 09:13, , 5F
哪需要安裝,不就一個exe檔而已,想唬我
09/09 09:13, 5F

09/09 09:17, , 6F
作好filter跟escape是不用太擔心,只是你沒作
09/09 09:17, 6F

09/09 09:36, , 7F
所以只要把grep.exe放在同一個目錄就可以執行了,是這樣嗎?
09/09 09:36, 7F

09/09 09:39, , 8F
filter&escape...嗯,筆記中,小的新手感謝S大教學
09/09 09:39, 8F

09/09 09:58, , 9F
是不用放同一個目錄,但你搜尋的位置跟路徑都要正確
09/09 09:58, 9F

09/09 09:58, , 10F
指令也可以用 c: && cd c:\book && c:\bin\grep.exe .
09/09 09:58, 10F

09/09 09:59, , 11F
..grep.exe "ooxx" *.exe -Ri
09/09 09:59, 11F

09/09 10:01, , 12F
windows有findstr,到處都有,不用裝。
09/09 10:01, 12F

09/09 10:01, , 13F
以前做專案就兩個版本,php用grep,asp用findstr。
09/09 10:01, 13F

09/09 11:43, , 14F
grep作者解釋為什麼快 有興趣可以看一下
09/09 11:43, 14F

09/09 11:44, , 16F
2010-August/019310.html
09/09 11:44, 16F

09/09 13:06, , 17F
http://3wa.tw/URL/327 findstr vs grep
09/09 13:06, 17F

09/09 13:07, , 18F
原po要速度,findstr慢2~5倍的別用了
09/09 13:07, 18F

09/09 19:32, , 19F
感謝各位高手指點,小的獲益良多。
09/09 19:32, 19F

09/09 19:33, , 20F
剛剛試了一下findstr,嗯,這個速度我還可以接受。
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
文章代碼(AID): #1NqPR8_A (PHP)
文章代碼(AID): #1NqPR8_A (PHP)