查看文件中是否找到字符串的最快方法?

时间:2011-05-16 13:49:13

标签: php unix filesystems

假设我有一个大文件。该文件是一个IP列表,每个IP都在一个新行上:

123.123.123.123
123.123.123.124
123.123.123.125
etc...

我可以这样做:

$file = file_get_contents($src);    
if (substr_count($file,'myip'))
    echo 'FOUND';

或者与数组样式类似的方式:

$file = file($src,FILE_IGNORE_NEW_LINES);
if (in_array('myip',$file))
    echo 'FOUND';

但我认为第三种可能更快的选择 逐行解析文件,当然如果找到字符串则停止读取。

这样的事情:

$file = fopen($src,'r');
while(!feof($file)) { 
    $ip = fgets($file);
    if ($ip == $myIP) {
        die('Found');
    }   
}
fclose($file);

我的问题是:你认为还有其他更好的方法吗?

在性能方面,您认为哪些代码更快?

非常感谢你们

3 个答案:

答案 0 :(得分:1)

如果可以,请考虑使用grepfind。它可能比PHP更快,更重要的是,内存效率更高。

答案 1 :(得分:0)

假设在某种语言中执行此操作是必需的,那么修改您的逐行代码可能是最好的,因此您不会获取超出需要的数据。

$file = fopen($src,'r');
while(!feof($file)) { 
    $ip = fgets($file);
    if ($ip == $myIP) {
        echo 'FOUND!';
        break; // dieing here won't close the file
    }   
}

fclose($file);

答案 2 :(得分:0)

如果您可以对文件进行排序,那么执行二进制搜索会很好。

但是,对文件进行排序需要一些时间,所以如果你进行大量的插入/删除操作,它可能不会很有效。