2014-02-07 57 views
1

我必须使用Apache Benchmark来测试URL(PHP脚本)。但是对于每个请求,我需要处理一组不同的数据,并且URL保持不变。因此,在该PHP脚本中,我需要读取一个3.000.000行文件并随机选择一个。这意味着对于每个ab请求,我需要读取该文件,然后获取一个随机行,然后处理它。PHP&压力测试 - 将大文件加载到内存中

你推荐什么方法?

我在想以某种方式在内存中加载该文件一次(并可用于所有请求),然后从它得到一个随机线。

换句话说,我需要从一个大文件中读取一个随机行而不“感觉”它。

谢谢!

+0

测试的重点是将此文件加载到内存中吗?或者是从文件中获得随机条目,然后处理是你想要测试的内容?在我看来,从一个大文件中随机输入的最有效方式总是一个有价值的目标,但我无法分辨这是否是你要求的。 – deceze

+0

不,测试的目的不是加载该文件。其目的是在每个请求中不加载文件的情况下获得一个随机条目。该测试是我得到一个随机输入后实际发生的情况。 – MariusP

+1

然后,我打开文件'fseek'到'0'和文件长度之间的随机位置,逐渐向后读取,直到找到换行符,然后从那里找到'fgets'。应该非常高效。 – deceze

回答

1
$fh = fopen($file, 'r'); 
$stats = fstat($fh); 

// jump to random location within file 
fseek($fh, mt_rand(0, $stats['size'] - 1)); 

// check where you are  
$chr = fread($fh, 1); 

// while you're not at a newline and not at the start of the file 
while ($chr != "\n" && ftell($fh) > 0) { 
    // go back one character (plus an additional one you've just read) 
    fseek($fh, -2, SEEK_CUR); 
    $chr = fread($fh, 1); 
} 

// you're just past a newline now, go read the whole next line 
$line = fgets($fh);