URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3857
[ Назад ]

Исходное сообщение
"cgi - доступ к файлам"

Отправлено hax , 20-Янв-05 15:10 
Есть задача сделать счетчик посещений страницы на Kylix.
Значение счетчика хранится в текстовом файле. Собственно процедура инкрементации счетчика выглядит так:

//в файле хранятся несколько счетчиков, index - номер счетчика
procedure TWebModule1.IncreaseQueryCount(index: integer);
var
s: TStringList;
i,j: integer;
begin
s:=TStringList.Create();
try
  s.LoadFromFile('counter.txt');
  if s.count>=2 then
   begin
    val(s[index],i,j);
    inc(i);
    s[index]:=inttostr(i);
    s.SaveToFile('counter.txt');
   end;

finally
end;
s.destroy;
end;

В один прекрасный момент counter.txt становится размером 0 байт. Как я понимаю, это происходит из-а того, что несколько экземпляров CGI одновременно пытаются получить доступ к файлу. Как можно решить эту проблему ? Нужно что-то типа mutex из Windows для разделения доступа к ресурсам. Я понимаю, что можно использовать записи в базе данных с возможностью блокировки, но в моем случае (настроить базу данных я точно не смогу, так как очень мало знаю Linux) нужен простейший путь - хранение в файле. Во всех статьях о "пишем счетчик на kylix" авторы этот вопрос как-то обходят стороной, и на письма не отвечают :)


Содержание

Сообщения в этом обсуждении
"cgi - доступ к файлам"
Отправлено chip , 21-Янв-05 15:14 
>Есть задача сделать счетчик посещений страницы на Kylix.
>Значение счетчика хранится в текстовом файле. Собственно процедура инкрементации счетчика выглядит так:
>
>
>//в файле хранятся несколько счетчиков, index - номер счетчика
>procedure TWebModule1.IncreaseQueryCount(index: integer);
>var
> s: TStringList;
> i,j: integer;
>begin
> s:=TStringList.Create();
> try
>  s.LoadFromFile('counter.txt');
>  if s.count>=2 then
>   begin
>    val(s[index],i,j);
>    inc(i);
>    s[index]:=inttostr(i);
>    s.SaveToFile('counter.txt');
>   end;
>
> finally
> end;
> s.destroy;
>end;
>
>В один прекрасный момент counter.txt становится размером 0 байт. Как я понимаю,
>это происходит из-а того, что несколько экземпляров CGI одновременно пытаются получить
>доступ к файлу. Как можно решить эту проблему ? Нужно что-то
>типа mutex из Windows для разделения доступа к ресурсам. Я понимаю,
>что можно использовать записи в базе данных с возможностью блокировки, но
>в моем случае (настроить базу данных я точно не смогу, так
>как очень мало знаю Linux) нужен простейший путь - хранение в
>файле.


man 2 flock

Как это в Хуликсе делается БМП

> Во всех статьях о "пишем счетчик на kylix" авторы этот
>вопрос как-то обходят стороной, и на письма не отвечают :)

может потому что никто не пишет счетчики на Кайликсе?


"cgi - доступ к файлам"
Отправлено ACCA , 22-Янв-05 03:00 
>В один прекрасный момент counter.txt становится размером 0 байт. Как я понимаю,
>это происходит из-а того, что несколько экземпляров CGI одновременно пытаются получить
>доступ к файлу. Как можно решить эту проблему ? Нужно что-то
>типа mutex из Windows для разделения доступа к ресурсам. Я понимаю,

Есть два решения - сложное и простое.

Сложное:

Переименуй файл в counter.$$, где $$ - уникальное число, например твой PID. Если переименование обломалось, засни на несколько мсек и пробуй ещё.

Открой counter.$$, прочти, запиши, закрой. Переименуй в counter.txt.


Простое:

Не пиши CGI на Kylix.