Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Уменьшение числа при инкременте
 
 автор: Владимир55   (14.10.2008 в 14:16)   письмо автору
 
 

На каждой странице сайта установлен вот такой код:

        $n = @file_get_contents("nip.txt");    
        if (!$n) $n = 0 ;  

        ++$n;
        $file = fopen ("nip.txt", "w") ;   
        fputs ($file, $n) ;                        
        fclose ($file) ;
Какое-то время он работает он нормально. Однако спустя время, в файле nip.txt появляется отрицательное число. Обычно четырехзначное.

Как такое возможно?

  Ответить  
 
 автор: cheops   (14.10.2008 в 14:49)   письмо автору
 
   для: Владимир55   (14.10.2008 в 14:16)
 

Странно что число четырехзначеное, однако, это возможно, так как у вас не осуществляется блокировка файла на момент записи в него значения. У вас PHP 5? Если да, то лучше используйте для записи функцию file_put_contents().

  Ответить  
 
 автор: Владимир55   (14.10.2008 в 16:16)   письмо автору
 
   для: cheops   (14.10.2008 в 14:49)
 

Признаться, я не уверен, что число четырехзначное. Так, по памяти. Я очистил систему, и лишь потом подумал, что это уже не первый случай, и потому, не случайность.

У меня РНР4.
Как быть в этом случае?

  Ответить  
 
 автор: ddhvvn   (14.10.2008 в 17:17)   письмо автору
 
   для: Владимир55   (14.10.2008 в 16:16)
 

попробуйте добавить в код блокировку файла.

пример

<?php

$fp 
fopen("/tmp/lock.txt""w+");

if (
flock($fpLOCK_EX)) { // выполнить эксплюзивное запирание
    
fwrite($fp"Что-нибудь пишем\n");
    
flock($fpLOCK_UN); // отпираем файл
} else {
    echo 
"Не могу запереть файл !";
}

fclose($fp);
?>

  Ответить  
 
 автор: Николай2357   (14.10.2008 в 19:05)   письмо автору
 
   для: ddhvvn   (14.10.2008 в 17:17)
 

С блокировками лучше так http://softtime.ru/forum/read.php?id_forum=1&id_theme=44056
отлично работает, я уже давно юзаю, проверено.

  Ответить  
 
 автор: Владимир55   (14.10.2008 в 23:02)   письмо автору
 
   для: Николай2357   (14.10.2008 в 19:05)
 

Что случится, если к заблокированному файлу обратится оператор из другой страницы? Не получит ли пользователь сообщения об ошибке, о невозможности открыть страницу?

  Ответить  
 
 автор: cheops   (15.10.2008 в 01:02)   письмо автору
 
   для: Владимир55   (14.10.2008 в 23:02)
 

Нет, просто поток дождется пока освободится файл.

  Ответить  
 
 автор: mechanic   (15.10.2008 в 09:31)   письмо автору
 
   для: cheops   (15.10.2008 в 01:02)
 

а каково, кстати, время ожидания?

  Ответить  
 
 автор: ddhvvn   (15.10.2008 в 11:04)   письмо автору
 
   для: mechanic   (15.10.2008 в 09:31)
 

Равно времени работы с файлом.... по идее небольшое..

  Ответить  
 
 автор: Владимир55   (15.10.2008 в 11:53)   письмо автору
 
   для: ddhvvn   (15.10.2008 в 11:04)
 

Коды, приведенные Николай2357 и ddhvvn, по объему различны.

Какой вариант лучше?

=============
У Николай2357 задержка в 1 сек, тогда как ddhvvn этого не делает. Вариант ddhvvn - быстрее?

  Ответить  
 
 автор: cheops   (15.10.2008 в 13:02)   письмо автору
 
   для: Владимир55   (15.10.2008 в 11:53)
 

Вариант ddhvvn не совсем корректный, так как файл нужно блокировать ещё до чтения, т.е. отказываться от функции file_get_contents(). Ведь если 20 одновременных посетителей прочитает файл они все приплюсуют к 20 цифру 1 и в файл ляжет 21 вместо 40.

PS Вы именно файловый вариант хотите реализовать? С СУБД MySQL все быстрее, проще и корректнее.

  Ответить  
 
 автор: ddhvvn   (15.10.2008 в 13:24)   письмо автору
 
   для: cheops   (15.10.2008 в 13:02)
 

Я только показал пример самой блокировки (из мануала), а не решение для автора )

  Ответить  
 
 автор: Владимир55   (15.10.2008 в 14:05)   письмо автору
 
   для: cheops   (15.10.2008 в 13:02)
 

С СУБД MySQL все быстрее, проще и корректнее.

Боязно как-то...

  Ответить  
 
 автор: Trianon   (15.10.2008 в 14:17)   письмо автору
 
   для: cheops   (14.10.2008 в 14:49)
 

странно, что минус появляется вообще.
Я, например, не понимаю, откуда он берется.

  Ответить  
 
 автор: Nytrogen   (15.10.2008 в 14:45)   письмо автору
 
   для: Trianon   (15.10.2008 в 14:17)
 

Я лично не знаю, как в PHP происходит чтение из файла, но числа так обычно преобразуются, когда инкремент переваливает за размерности некоторого типа... Например, если число занимает один байт и имеет знаковый тип, то оно вечно будет "крутиться" от -128 до 127... Это как идея =)

  Ответить  
 
 автор: Trianon   (15.10.2008 в 14:49)   письмо автору
 
   для: Nytrogen   (15.10.2008 в 14:45)
 

из файла читается строка.
А инкремент числа не замкнут целым типом - это не С.
Идея отметается.

  Ответить  
 
 автор: Владимир55   (15.10.2008 в 19:10)   письмо автору
 
   для: Trianon   (15.10.2008 в 14:49)
 

Однако минус все же имеет место! Только что наблюдал еще один сбой - и опять с минусом.

  Ответить  
 
 автор: Саня   (15.10.2008 в 21:13)   письмо автору
 
   для: Владимир55   (15.10.2008 в 19:10)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования