блокировка файла

Статус
В этой теме нельзя размещать новые ответы.

saiman

Новичок
ок.
значит немного другая задача. не касающаяся того о чем говорили раньше.

есть файл скажем index:
Код:
include("functions.php");

$stats = new stats;
...............................
$stats->update();
файл function.php:

Код:
class stats {

$d = opendir ("data/stats");
            while ($file = readdir ($d))
            {
             if (stristr($file,'.dat'))
              {
                $st_day = str_replace('.dat','',$file);
                        $this->st_days[] = $st_day;
             }
            }
            closedir ($d);

                $this->today = max ($this->st_days);

        }

        function getstats($day_stamp = "all") {
                if ($day_stamp == "all") {
                        $stamps = $this->st_days;
                } else {
                        $stamps = array($day_stamp);
                }
                foreach ($stamps AS $stamp) {
                        $ff = fopen("data/stats/$stamp.dat","r");
                        $buf="";
                        while (!feof($ff)) {
                                $buf .= fgets($ff);
                        }
                        $ret[$stamp] = unserialize($buf);
                        fclose($ff);
                }
                return $ret;
        }

        function update(){
                $today_stats = $this->getstats($this->today);
                $dttm = time();
                $curr_stats['dt'] = $dttm;
                $curr_stats['data'] = $datas;
                
                $today_stats[$this->today][] = $curr_stats;
                $fu = fopen("data/stats/$this->today.dat","w+");
                flock($fu, LOCK_EX);
                fputs($fu,serialize($today_stats[$this->today]));
                fflush ($fu);
                flock($fu, LOCK_UN);
                fclose($fu);
        }

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

-~{}~ 20.11.07 14:22:

простите, "он обнуляется" это я о текстовом файле в котором хранится стата
 

saiman

Новичок
'w+' - Открыть для чтения и записи; поместить указатель в начало файла и усечь файл до нулевой длины. Если файл не существует, делается попытка создать его.

хочешь сказать что нам необходимо "W" (без +) ??
 

Фанат

oncle terrible
Команда форума
а что сделает w такого, что не делает w+?

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

saiman

Новичок
ну по сути все так и должно быть. файл стирается потом записывается заново уже со старым содержимым плюс новая запись которая добавилась. поскольку данные записываются в сериализованом массиве, а не построково - то модификатор "А" не подойдет. только вот почему содержимое не записывается после очищения файла? где может быть накладка?
 

Фанат

oncle terrible
Команда форума
накладкав большом количестве посетителей.
один стирает из файла все, второй читает уже пустой файл, и записывает тоже пустоту.
сначала надо блокировать файл, а потом уже стирать все
 

dimagolov

Новичок
saiman
потому что кто-то успевает его прочитать пустым и потом добавить одну строку и записать назад с одной строкой.

переделай формат файла и дописывай построчно в конец.

блин, дубль :(
 

saiman

Новичок
нет возможности писать построково ,
необходим массив. и ктому же возможно я ошибаюсь но помоему файл стирается в строке fputs($fu,serialize($today_stats[$this->today]));
а не в
$fu = fopen("data/stats/$this->today.dat","w+");
 

saiman

Новичок
первый пост читайте
Код:
                $fu = fopen("data/stats/$this->today.dat","w+");
                flock($fu, LOCK_EX);
                fputs($fu,serialize($today_stats[$this->today]));
                fflush ($fu);
                flock($fu, LOCK_UN);
                fclose($fu);
flock используется
 

Фанат

oncle terrible
Команда форума
ты этот тон поучительный оставь себе.
где у тебя "flock используется", а где - обнуление файла?
 

saiman

Новичок
файл можно заблокировать до того как он открывается??

можно пример?
 

Nelius

кипарис во дворе
Я дал вам ссылку на мануал по flock, так как там в комментариях есть много примеров его использования в том числе в паре с is_writable.
Таже у данной функции есть масса ньюансов, которые стоит учесть.
 

Фанат

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

fixxxer

К.О.
Партнер клуба
1. open for append
2. lock
3. truncate to 0
4. seek to 0
5. write
6. unlock
7. close

рапечатать, повесить на стенку.
 

Pigmeich

Новичок
saiman
Во-первых flock возвращает код успеха - никогда не помешает его проверить.

Во-вторых, на примеры тебе указали.

В-третьих затирать файл можно не только модификатором при открытии.
 

dimagolov

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