PHP - открыть файл TXT, добавить +1 к содержанию при нажатии на ссылку - PullRequest
0 голосов
/ 18 ноября 2009

Как я могу сделать так, чтобы, когда пользователь щелкает ссылку на моей веб-странице, он записывает в файл .txt с именем «Count.txt», который содержит только число и добавляет 1 к этому числу? Спасибо.

Ответы [ 4 ]

3 голосов
/ 18 ноября 2009

Если вы отказываетесь от какой-либо проверки достоверности, вы можете сделать это с помощью чего-то простого:

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

Дополнительно:

В этой теме говорится о параллелизме, и следует отметить, что для работы с параллелизмом неплохо использовать базу данных и транзакции, я настоятельно рекомендую не писать связку кода для этого в файле. .

Если вы когда-либо имели или думаете, что у вас может быть два запроса на ресурс в одну и ту же секунду, вам следует изучить PDO с mysql или PDO с SQLite вместо файла, используйте транзакции (и InnoDB или лучше, если вы собираетесь использовать MySQL).

Но на самом деле, даже если вы получаете два запроса в одну и ту же микросекунду (очень маловероятно), шансы на блокировку файла невелики, так как он не будет оставаться открытым, и два запроса, вероятно, не будут обрабатываться достаточно параллельно для блокировки в любом случае. Проверка реальности: сколько хитов на одном ресурсе вы получаете в среднем за одну минуту? ...

2 голосов
/ 18 ноября 2009

Если вы решите сделать что-то более сложное, например, два числа, вы можете рассмотреть возможность использования SQLite. Это примерно так же быстро и просто, как открыть и закрыть файл, но гораздо более гибко.

1 голос
/ 18 ноября 2009

Откройте файл, заблокируйте файл (ОЧЕНЬ важно), прочитайте текущий номер, добавьте 1 к числу, запишите номер обратно в файл, снимите блокировку и закройте файл.

т. что-то вроде:

$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);

должно работать (не проверено).

1 голос
/ 18 ноября 2009

Обычно это довольно просто:

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

Но при использовании этого кода вы столкнетесь с проблемами параллелизма. Один из способов создать безопасный замок из любого состояния гонки:

$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); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...