Engelleme dosya okuma php?

4 Cevap php

Bir metin dosyası her şeyi okumak ve yankı istiyorum. Ama ben, okurken metin dosyasına yazılır daha hatları yüzden yerine ben daha hatları için sonsuza kadar beklemek wan't, bu dosyanın sonuna ulaştığında komut çıkmak istemiyorum olabilir. Bu php mümkün mü?

4 Cevap

Ben onu çözdüm.

Hüner fopen kullanmak ve eof ulaşıldığında önceki konuma imleci ve oradan okumaya devam etmek oldu.

<?php
$handle = fopen('text.txt', 'r');
$lastpos = 0;
while(true){
   if (!feof($handle)){
       echo fread($handle,8192);
       flush();
       $lastpos = ftell($handle);
   }else{
       fseek($handle,$lastpos);
   }
}
?>

Hala oldukça fazla işlemci tüketir olsa da, bu nasıl çözüleceğini bilmiyorum.

bu sadece bir tahmin olduğunu, ancak (passthru) bir "tail-f" çıktı geçmesine deneyin.

ancak () sizin tampon temizlemek için bir yol bulmak gerekir.


Çok güzel bir çözüm ajax site oluşturmak olacaktır IMHO.

bir dizi için dosyanın içeriğini okumak. oturumda satır numarasını kaydetmek. dosyanın içeriği yazdırmak.

hat sayısı sayfasına sonucu append seans sayısı o büyükse, dosyayı denetleyen bir komut dosyası için bir ajax isteği her x saniyede başlar.


Eğer () inststed popen kullanabilirsiniz:

$f = popen("tail -f /where/ever/your/file/is 2>&1", 'r');
while(!feof($f)) {
    $buffer = fgets($f);
    echo "$buffer\n";
    flush();
    sleep(1);
}
pclose($f)

uyku% 100 CPU zaman olacak o olmadan, önemlidir.

Aslında, ne zaman bunu tampon gider, onu "echo". Tarayıcı hala çıktı alırken bu eklenen Yani ne istiyorsun "iliştirme" yeni içerik olduğunu. Ve bu mümkün değildir (ama bu bazı yaklaşımlar vardır).

Çıktı göndermek, sen en son değişiklik damgası almak ve sonunda geçerli biriyle saklanan filemtime tekrar karşılaştırmak: Ayrıca filemtime kullanabilirsiniz.

Eğer isterseniz Neyse, komut tarayıcı (veya müşteri), sen parçalarını kullanarak çıkış (fread, flush), daha sonra herhangi bir değişiklik kontrol göndermek gerektiğini, aynı zamanda gitmek sonu. Herhangi bir değişiklik varsa, (size while(!feof()) döngünün dışında pozisyon alabilirsiniz) dosyasını yeniden açın ve son konumdan okuma.