| |
|
|
| | На каждой странице сайта установлен вот такой код:
$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)
| | | Возможно с этим файлом работает другой скрипт, результаты которого вполне могут быть отрицательными. | |
| |
|
|