如果線的長度是文字和變量,你可以不知道哪個線#97;唯一使它成爲第97位的是前面有96行。
所以,你需要閱讀整個文件到這一點(這是SplFileObject做什麼):
$fp = fopen("keywords.txt", "r");
while($line--)
{
if (feof($fp))
// ERROR: line does not exist
$text = fgets($fp, 1024); // 1024 = max length of one line
}
fclose($fp);
但如果你能在每行之前存儲的行號,即該文件是
最有可能的
- start with s1 = 0 and s2 = file length
- read a keyword and line number at seek position s3 = (s1+s2)/2 (*)
- if line number is less than desired, s1 = s3; else s2 = s3; and repeat previous step.
- if line number is the one desired, strip the number from the text and you get the keyword.
(*),因爲該行:
...
95 abbagnale
96 abbatangelo
97 abbatantuono
98 ...
那麼你可以實現一種二進制搜索不會在s#正好開始,你需要與fgets:一個擺脫了僞半關鍵字,第二讀取的行號。當你「關閉」時,閱讀一個更大的塊並將其分成多行會更快。例如,您尋找第170135行並在第170180行讀取:您最好做的是將搜索位置倒回一千字節,讀取一千字節的數據,然後在那裏尋找170135。
或者,如果各行的長度不太相同,則可能需要存儲固定大小的行(這裏「#」實際上應該是空格,並且在行長度中需要對行進行計數終止子,\ n或\ r \ n)的:
abbagnale#########
abbatangelo#######
abbatantuono######
,然後說每個關鍵字是32個字節,
$fp = fopen("keywords.txt", "r");
fseek($fp, 97 * 32, SEEK_SET);
$text = trim(fgets($fp, 32));
fclose($fp);
會或多或少瞬時的。
如果文件位於遠程服務器上,您仍然需要下載整個文件(直到所需的行),通過在遠程服務器上放置一個「scanner」腳本可以更好地服務運行搜索。然後你可以運行
$text = file_get_contents("http://www.mysite.com/keywords.php?line=97");
並以毫秒爲單位獲得你的行。
你爲什麼不使用數據庫來實現呢? – 2013-02-18 11:16:58