|
|
|
| На каждой странице сайта установлен вот такой код:
$n = @file_get_contents("nip.txt");
if (!$n) $n = 0 ;
++$n;
$file = fopen ("nip.txt", "w") ;
fputs ($file, $n) ;
fclose ($file) ;
| Какое-то время он работает он нормально. Однако спустя время, в файле nip.txt появляется отрицательное число. Обычно четырехзначное.
Как такое возможно? | |
|
|
|
|
|
|
|
для: Владимир55
(14.10.2008 в 14:16)
| | Странно что число четырехзначеное, однако, это возможно, так как у вас не осуществляется блокировка файла на момент записи в него значения. У вас PHP 5? Если да, то лучше используйте для записи функцию file_put_contents(). | |
|
|
|
|
|
|
|
для: cheops
(14.10.2008 в 14:49)
| | Признаться, я не уверен, что число четырехзначное. Так, по памяти. Я очистил систему, и лишь потом подумал, что это уже не первый случай, и потому, не случайность.
У меня РНР4.
Как быть в этом случае? | |
|
|
|
|
|
|
|
для: Владимир55
(14.10.2008 в 16:16)
| | попробуйте добавить в код блокировку файла.
пример
<?php
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // выполнить эксплюзивное запирание
fwrite($fp, "Что-нибудь пишем\n");
flock($fp, LOCK_UN); // отпираем файл
} else {
echo "Не могу запереть файл !";
}
fclose($fp);
?>
|
| |
|
|
|
|
|
|
|
для: ddhvvn
(14.10.2008 в 17:17)
| | С блокировками лучше так http://softtime.ru/forum/read.php?id_forum=1&id_theme=44056
отлично работает, я уже давно юзаю, проверено. | |
|
|
|
|
|
|
|
для: Николай2357
(14.10.2008 в 19:05)
| | Что случится, если к заблокированному файлу обратится оператор из другой страницы? Не получит ли пользователь сообщения об ошибке, о невозможности открыть страницу? | |
|
|
|
|
|
|
|
для: Владимир55
(14.10.2008 в 23:02)
| | Нет, просто поток дождется пока освободится файл. | |
|
|
|
|
|
|
|
для: cheops
(15.10.2008 в 01:02)
| | а каково, кстати, время ожидания? | |
|
|
|
|
|
|
|
для: mechanic
(15.10.2008 в 09:31)
| | Равно времени работы с файлом.... по идее небольшое.. | |
|
|
|
|
|
|
|
для: ddhvvn
(15.10.2008 в 11:04)
| | Коды, приведенные Николай2357 и ddhvvn, по объему различны.
Какой вариант лучше?
=============
У Николай2357 задержка в 1 сек, тогда как ddhvvn этого не делает. Вариант ddhvvn - быстрее? | |
|
|
|
|
|
|
|
для: Владимир55
(15.10.2008 в 11:53)
| | Вариант ddhvvn не совсем корректный, так как файл нужно блокировать ещё до чтения, т.е. отказываться от функции file_get_contents(). Ведь если 20 одновременных посетителей прочитает файл они все приплюсуют к 20 цифру 1 и в файл ляжет 21 вместо 40.
PS Вы именно файловый вариант хотите реализовать? С СУБД MySQL все быстрее, проще и корректнее. | |
|
|
|
|
|
|
|
для: cheops
(15.10.2008 в 13:02)
| | Я только показал пример самой блокировки (из мануала), а не решение для автора ) | |
|
|
|
|
|
|
|
для: cheops
(15.10.2008 в 13:02)
| | С СУБД MySQL все быстрее, проще и корректнее.
Боязно как-то... | |
|
|
|
|
|
|
|
для: cheops
(14.10.2008 в 14:49)
| | странно, что минус появляется вообще.
Я, например, не понимаю, откуда он берется. | |
|
|
|
|
|
|
|
для: Trianon
(15.10.2008 в 14:17)
| | Я лично не знаю, как в PHP происходит чтение из файла, но числа так обычно преобразуются, когда инкремент переваливает за размерности некоторого типа... Например, если число занимает один байт и имеет знаковый тип, то оно вечно будет "крутиться" от -128 до 127... Это как идея =) | |
|
|
|
|
|
|
|
для: Nytrogen
(15.10.2008 в 14:45)
| | из файла читается строка.
А инкремент числа не замкнут целым типом - это не С.
Идея отметается. | |
|
|
|
|
|
|
|
для: Trianon
(15.10.2008 в 14:49)
| | Однако минус все же имеет место! Только что наблюдал еще один сбой - и опять с минусом. | |
|
|
|
|
|
|
|
для: Владимир55
(15.10.2008 в 19:10)
| | Возможно с этим файлом работает другой скрипт, результаты которого вполне могут быть отрицательными. | |
|
|
|