PHP - link tıklandığında Open TXT dosya içeriğine 1 eklemek

4 Cevap

Nasıl bir kullanıcı benim web sayfasında bir linke tıkladığında o kadar, sadece bir sayı içerir ve bu sayının 1 ekler "Count.txt" adında bir. Txt dosyasına yazar yapabilir? Teşekkür ederim.

4 Cevap

Eğer kontrol herhangi bir geçerliliği vazgeçmek Eğer gibi basit bir şey yapabilirdi:

file_put_contents($theCounterFile, file_get_contents($theCounterFile)+1);

Addition:

Orada bu iplik eşzamanlılık hakkında konuşmak ve onu bir veritabanı ve eşzamanlılık ile başa çıkmak için işlemler kullanmak iyi bir fikir olduğunu belirtmek gerekir, ben çok bir dosyada bunu sıhhi tesisat kod bir demet yazma karşı tavsiye ederim.

Eğer şimdiye kadar, ya da hiç mysql ile PDO içine bakmak, veya PDO gerektiği ile aynı saniyede kaynak için iki istekleri olabileceğini düşünüyorum ettiyseniz {[(2) }] bir dosya yerine, kullanımı işlemleri (ve InnoDB ya da daha iyi mysql için gidiyoruz).

Açık tutulması olmayacak ve iki istekleri muhtemelen yine kilitlemek için yeterli paralel ele olmayacak gibi ama gerçekten, aynı mikrosaniye (yüksek ihtimal) iki istekleri almak bile, dosya kilitleme şansı azdır. Reality check:? Aynı kaynak aynı dakikada ortalama alabilirim kaç tıklama ...

Eğer daha gelişmiş bir şey yapmaya karar verirseniz, gibi SQLite kullanarak düşünebilirsiniz, iki sayı söylüyorlar. Bu kadar hızlı açılış ve bir dosyayı kapatma gibi basit ilgili olarak ilgili, ama çok daha esnektir.

, Dosyayı açın dosyayı (ÇOK önemli) kilitlemek, şu anda orada numarasını okumak sayısına 1 eklemek, geri dosyaya numarasını yazıp, kilidi serbest bırakın ve dosyayı kapatın.

yani. gibi bir şey:

$fp = fopen("count.txt", "r+");

if (flock($fp, LOCK_EX)) { // do an exclusive lock
    $num = fread($fp, 10);
    $num++;
    fseek($fp, 0);
    fwrite($fp, $num);
    flock($fp, LOCK_UN); // release the lock
} else {
    // handle error
}
fclose($fp);

(test değil) çalışması gerekir.

Genellikle bu oldukça kolaydır:

$count = (int)file_get_contents('/path/to/Count.txt');
file_put_contents('/path/to/Count.txt', $count++, LOCK_EX);

Ama bu kodu kullanarak eşzamanlılık sorunlar koşacağız. Herhangi bir yarış durumu güvenli bir kilit oluşturmak için bir yoldur:

$countFile = '/path/to/Count.txt';
$countTemp = tempnam(dirname($countFile), basename($countFile));
$countLock = $countFile . '.lock';
$f_lock = fopen($countLock, 'w'); 
if(flock($f_lock, LOCK_EX)) {
    $currentCount = (int)file_get_contents($countFile);
    $f_temp = fopen($countTemp, 'w');
    if(flock($f_temp, LOCK_EX)) {
        fwrite($f_temp, $currentCount++); 
        flock($f_temp, LOCK_UN); 
        fclose($f_temp); 
        if(!rename($countTemp, $countFile)) { 
            unlink($countTemp); 
        } 
    }
    flock($f_lock, LOCK_UN);
    fclose($f_lock); 
}