|
|
|
|
|
для: Sfinks
(04.02.2005 в 12:46)
| | Плохо вот что... вы открываете файл и начинаете очень долго что-то вычислять в циклах, а потом по кусочкам записываете файл - это слишком долго, не мудрено, что они сыпятся... Лучше всё вычислить не спеша и записать в строку, а затем файл открыть, быстренько строку записать и закрыть файл, т.е. не держать его долго в открытом состоянии и писать в него по возможности всё сразу. | |
|
|
|
|
|
|
|
для: cheops
(04.02.2005 в 07:37)
| | Числа 502010112 и т.д. - это время - (int)date("ymdHi",time());
Вот как выглядит фрагмент перезаписи....
<?php
if(file_exists("vis.php"))
while(!@include("vis.php"));
if($fvis = @fopen("vis.php","wb"))
{ while(!flock($fvis, LOCK_EX));
$dt = (int)date("ymdHi",time());
$visits[$dt]["acc"]++;
$old = false;
if(isset($visits))
foreach($visits as $info)
if(isset($info["new"]))
if(in_array($pid,$info["new"]))
{ $old = true;
break;
}
if(!$old)
$visits[$dt]["new"][] = $pid;
fwrite($fvis,'<? $visits = array (');
if(isset($visits))
foreach($visits as $time => $info)
{ fwrite($fvis,"\r\n$time=>array('acc'=>".$info["acc"]);
if(isset($info["new"]))
{ fwrite($fvis,",'new'=>array(");
foreach($info["new"] as $u_pid)
fwrite($fvis,"'$u_pid',");
fwrite($fvis,")");
}
fwrite($fvis,"),");
}
fwrite($fvis,"\r\n); return(true); ?>");
flock($fvis, LOCK_UN);
fclose($fvis);
}
?>
|
те при каждом обращении увеличивается счетчик обращений за текущую минуту (порой доходит до 18ти), и проверяет весь массив на наличие идентификатора обратившегося пользователя. Если он не найден, значит это новый пользователь и его PID дописывается в список новых за эту минуту.
Фактически, разбиение ускорения не даст, т.к. всерн придется просматривать все файлы, но надежность увеличится.... но не достаточно =(( Не достаточно, т.к. файл падает несколько раз за сутки. А разбивать по 2 часа, это уже паранойя =((
Нужно какой-то другой выход.....
Наверняка Вы задаете себе вопрос, почему я не использую MySQL.... по нескольким причинам.... 1. Я его совсем не знаю... Абсолютно 0! А учить с 0 для этого конкретного проекта уже некогда. 2. Выкачать его по GPRS.... ну сами понимаете. 3. Это нужно на хосте подключать доп услугу... снова дорого. Поэтому хочу решить так.
Да, и способ с переименованием на 2 поста выше - эт разве не выход? | |
|
|
|
|
|
|
|
для: sfinks
(04.02.2005 в 00:42)
| | А вы как опеределяете числа
501290102
501290103
501290104
|
1) Можно вот какой финт сделать - под хранение этого числа завести ещё один файл и хранить там это значение, открытие, чтение и перезапись одного короткого файла будет происходить много быстрее, чем перезапись 100 Кб файла, а в 100 Кб файл останется только дописывать уже готовую информацию и не открывать его для анализа. Правда это не спасёт от порчи файла - здесь вы правы - нужно по датам разбивать - чем короче файл, тем больше у него шансов выжить.
2) Можно вот ещё чего сделать - под текущий период завести 10 файлов, и писать в файлы по датчику случайных чисел, а потом, когда данные будут отправляться в архив - объединять их в один файл. Вот этим можно здорово снять нагрузку с файла, а хранение индекса в отдельной файле не позволит сбиться со счёта. | |
|
|
|
|
|
|
|
для: cheops
(03.02.2005 в 16:12)
| | А я вот что подумал,....
А если не писать в файл vizity.php, а писать во временный файл, например, vizity_1.php (или следующий порядковый номер, в зависимости от наличия), а по завершении записи переименовывать его в vizity.php?... М? Ведь переименование это лишь исправление FAT? Значит процесс практически мгновенный? Будет ли это надежно?
Или Вы мне все-таки предложите что-либо? | |
|
|
|
|
|
|
|
для: cheops
(03.02.2005 в 16:12)
| | Это скорее Mobile-приложение.
Примитивно логику можно описать так....
Пользователь BeeLine отправляет смс с командой, команда попадает в основной php файл, в зависимости от команды, возвращается разный текст. Кроме этого php получает идентификатор пользователя и доп.инфо и ведет статистику.
Статистика должна иметь такую структуру, чтобы из нее можно было получить следующие данные:
1. Количество обращений каждого из зарегистрированных пользователей.
2. Количество обращений любых пользователей за указанный период времени (например 7.12.05 с 0:00 до 12:00), сколько из них являются обращениями от пользователей, у которых это минимум пятое обращение за все время пользования сервисом, общее количество обратившихся пользователей и сколько из них являются новыми пользователями (обратились впервые).
Вот сейчас структура данных обоих статистик аналогична:
По первой статистике:
<? $users = array (
'HW9GN4'=>array('reg'=>'СПб','acc'=>276,'tim'=>2),
..................
'9H1FN4'=>array('reg'=>'Москва','acc'=>230,'tim'=>3),
); return(true); ?>
|
По второй статистике (реализованы ток кол.нов.польз. и общее кол.обращений):
<? $visits = array (
'501290102'=>array('acc'=>1,'new'=>array('ASDF',)),
'501290103'=>array('acc'=>5,'new'=>array('DFGH','SDFG',)),
'501290104'=>array('acc'=>18,'new'=>array('FGHJ','GHJK','HJKL','JKLM',)),
..................
'501290828'=>array('acc'=>1,'new'=>array('RLXEU4',)),
); return(true); ?>
|
Вот с первым все нормально, а второй постоянно падает!
Правда частота перезаписи у второго в 100 раз больше.
И судя по всему, второй файл (или то, что мы придумаем), нужно разбивать на отдельные файлы, каждый из которых будет за определенную дату, тк только за сутки размер этого файла приближается к 100 кб. | |
|
|
|
|
|
|
|
для: Sfinks
(03.02.2005 в 15:51)
| | Опишите пожалуйста логику Web-приложения, может вместе придумаем другую схему (более надёжную). | |
|
|
|
|
|
|
|
для: cheops
(02.02.2005 в 23:52)
| | Так что же мне сделать? =(( Он снова упал =(( | |
|
|
|
|
|
|
|
для: cheops
(02.02.2005 в 23:52)
| | Вот в 23-30 снова обнулился =((
А файл пользователей размером в 30 раз больше не обнуляется уже 3 недели!
Вся глобальная разница массивов - имена подмассивов первого уровня! | |
|
|
|
|
|
|
|
для: cheops
(02.02.2005 в 23:52)
| | Вот щас посреди файла откуда-то взялась пустая строка! Как такое возможно? =(( | |
|
|
|
|
|
|
|
для: cheops
(02.02.2005 в 23:52)
| | >Сейчас файлы везде блокируются или только в одном месте?
Я Вам на e-Mail (письмо автору) скинул полный код основного файла!
>Ситуация с обнулением не воспроизводится?
Обнулялся в 16 с копейками, в 20 с копейками.
>Не может обнуляться она случайно при записи туда пустого значения?
Не знаю! Я уже не представляю что думать! Что интересно, остальные файлы проекта перезаписываются таким же образом, но они (тьфу-тьфу-тьфу) ни разу не обнулялись. Может какие-то проблемы с типами значений, или я уже не знаю....
>У вас информация не добавляется в конце файла, а каждый раз затирает
>предыдущие изменения - это нормальное поведение?
Во-первых, я не разобрался со смещениями курсора в файле при дописывании, а во-вторых, в данном конкретном счетчике возможно проще дописывать, но в файле пользователей, это сложнее, так как пользователя нужно искать по всему файлу. Но если Вы мне напишите фрагменты "редактирования" файлов, вместо "перезаписи", буду благодарен! Структуру файлов данных Вы поймете из кода на e-Maile.
>Ведь передав пустой цикл - можно обнулить файл.
Если предыдущим обращением файл сохранен корректно, то передать пустой массив невозможно, так как он инифиализируется инклюдом из этого же файла, непосредственно перед сохранением! | |
|
|
| |
|