PHP&;压力测试-将大文件加载到内存中
我必须使用Apache基准测试URL(PHP脚本)。但是对于每个请求,我需要处理一组不同的数据,并且URL保持不变。所以在PHP脚本中,我需要读取一个3.000.000行的文件,然后随机选择一个。这意味着对于每个ab请求,我需要读取该文件,然后获得一个随机行,然后处理它 你推荐什么方法 我想以某种方式将该文件加载到内存中一次(并可用于所有请求),然后从中随机获得一行 换句话说,我需要从一个大文件中随机读取一行,而不需要“感觉”它PHP&;压力测试-将大文件加载到内存中,php,Php,我必须使用Apache基准测试URL(PHP脚本)。但是对于每个请求,我需要处理一组不同的数据,并且URL保持不变。所以在PHP脚本中,我需要读取一个3.000.000行的文件,然后随机选择一个。这意味着对于每个ab请求,我需要读取该文件,然后获得一个随机行,然后处理它 你推荐什么方法 我想以某种方式将该文件加载到内存中一次(并可用于所有请求),然后从中随机获得一行 换句话说,我需要从一个大文件中随机读取一行,而不需要“感觉”它 谢谢大家! 测试的目的是将此文件加载到内存中吗?或者是从您随后处理
谢谢大家! 测试的目的是将此文件加载到内存中吗?或者是从您随后处理的文件中获取一个随机条目的点,并且处理是您想要测试的?在我看来,从一个大文件中获取一个随机条目的最有效的方法总是一个值得追求的目标,但我不知道这是否是你要问的。不,测试的目的不是加载那个文件。它的目的是获得一个随机条目,而无需在每个请求中加载文件。测试是在我得到一个随机条目后实际发生的。然后我打开文件,
fseek
到0
和文件长度之间的一个随机位置,一点一点地向后读取,直到我发现一个换行符,然后从那里开始fgets
。应该非常有效。为什么不将文件加载到数据库或内存中呢?获取随机id并按主id选择?此设置中不能包含数据库。谢谢
$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);