PHP arama Verimli düz bir dosya

6 Cevap php

Ben üst alakasız bir başlık ile, bir düz metin dosyasında ~ 5000 IP adreslerine 0 saklamak istiyorum. Böyle bir şey:

Unrelated data
Unrelated data
----SEPARATOR----
1.2.3.4
5.6.7.8
9.1.2.3

Şimdi ben '5 .6.7.8 'PHP kullanarak bu metin dosyasında olup olmadığını bulmak istiyorum. Ben sadece hiç bir dosyanın tamamını yüklenen ve bellekte işlenir, ancak PHP bir metin dosyası arama daha verimli bir yolu olup olmadığını merak ettik. Var ise ben sadece bir doğru / yanlış gerekir.

Herkes herhangi bir ışık tutabilir? Yoksa ilk dosyadaki tüm yükleme ile sıkışmış olacak?

Şimdiden teşekkürler!

6 Cevap

5000 kayıtları bir sürü değildir. Sen bunu kolayca yapabilir:

$addresses = explode("\n", file_get_contents('filename.txt'));

ve elle arama ve hızlı olacak.

Bir çok depolama olsaydı daha ben bu tür şeyler için tasarlanmış bir veritabanı, bunları saklamak öneririz. Ama 5000 için ben tam yük artı arama kaba kuvvet gayet iyi olduğunu düşünüyorum.

Eğer bir sorununuz varsa kadar bir sorun optimize etmeyin. Gereksiz yere çözüm overcomplicating anlamı yok.

Perl komut satırı aracı işlemek için tüm dosyayı yüklemek gerekiyor emin değilim, ama buna benzer bir şey yapabilirsiniz:

<?php
...
$result = system("perl -p -i -e '5\.6\.7\.8' yourfile.txt");
if ($result)
    ....
else
    ....
...
?>

Başka bir seçenek IP ait ayrı dosyalarda birinci veya ikinci grubuna göre depolamak olacaktır:

# 1.2.txt
1.2.3.4
1.2.3.5
1.2.3.6
...

# 5.6.txt
5.6.7.8
5.6.7.9
5.6.7.10
...

... etc.

Bu şekilde mutlaka dosyaları belleğe tüm dosya yükleyerek bir performans ceza çok büyük olma konusunda endişelenmenize gerek olmazdı.

Sen dışarı kabuk ve bunun için grep olabilir.

Sen fgets() deneyebilirsiniz

Bu satır bir dosya satır okur. Ben bu olsa ne kadar daha etkili emin değilim. Ben IP dosyanın üstüne doğru olsaydı daha verimli olacak ve IP dibe doğru olmadığını sadece bütün dosyasında okuma daha az etkili olacağını tahmin ediyorum.

Eğer bir Linux sunucu üzerinde de ters tırnakların ile GREP komutunu kullanabilirsiniz. Gibi bir şey:

$searchFor = '5.6.7.8';
$file      = '/path/to/file.txt';

$grepCmd   = `grep $searchFor $file`;
echo $grepCmd;

Ben şahsen bu test değil, ancak büyük dosya ayrıştırma için yazılmış PHP kılavuzda kod parçacığını var:

http://www.php.net/manual/en/function.fgets.php#59393

//File to be opened
$file = "huge.file";
//Open file (DON'T USE a+ pointer will be wrong!)
$fp = fopen($file, 'r');
//Read 16meg chunks
$read = 16777216;
//\n Marker
$part = 0;

while(!feof($fp)) {
    $rbuf = fread($fp, $read);
    for($i=$read;$i > 0 || $n == chr(10);$i--) {
        $n=substr($rbuf, $i, 1);
        if($n == chr(10))break;
        //If we are at the end of the file, just grab the rest and stop loop
        elseif(feof($fp)) {
            $i = $read;
            $buf = substr($rbuf, 0, $i+1);
            break;
        }
    }
    //This is the buffer we want to do stuff with, maybe thow to a function?
    $buf = substr($rbuf, 0, $i+1);
    //Point marker back to last \n point
    $part = ftell($fp)-($read-($i+1));
    fseek($fp, $part);
}
fclose($fp);

Hackajar yahoo com: pasajı orijinal yazar tarafından yazılmıştır