2014-02-07 94 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);